1. 程式人生 > 其它 >P2285 打鼴鼠

P2285 打鼴鼠

傳送門

當兩隻鼠鼠出現的時間間隔小於出現位置的曼哈頓距離時,則可以銜接(二連擊),所以定義狀態 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; }