P2285 打鼴鼠
阿新 • • 發佈:2022-03-30
當兩隻鼠鼠出現的時間間隔小於出現位置的曼哈頓距離時,則可以銜接(二連擊),所以定義狀態 dp[i] 為擊打了第 i 只鼠鼠後的擊打數,狀態轉移方程為尋找前 i-1 只鼠鼠(曼哈頓距離內)被擊打時的擊打數值( dp[1~i-1] )的最大值,在此基礎上+1。初始化時要注意每隻鼠鼠都為1(已經擊打)。
#include<iostream> #include<cmath> #define MAXN 10010 using namespace std; int n, m, x[MAXN], y[MAXN], times[MAXN], dp[MAXN]; int main(void) { cin >> n >> m; for (int i = 1; i <= m; i++) cin >> times[i] >> x[i] >> y[i]; dp[1] = 1; int ans = 0; for (int i = 2; i <= m; i++) { dp[i]=1; for (int j = i - 1; j >= 1; j--) { int len = fabs(x[i] - x[j]) + fabs(y[i] - y[j]);if (len <= times[i] - times[j]) dp[i] = max(dp[i], dp[j] + 1); } } for (int i = 1; i <= m; i++) ans = max(ans, dp[i]); cout << ans; return 0; }