「 Luogu P2285 」打鼴鼠
阿新 • • 發佈:2018-09-04
std 位置 解題思路 str -- code stream 但是 clas
解題思路
第一眼看上去覺得要設計一個三維的 DP,$dp[i][j][k]$ 表示在 $(i,j)$ 這個位置上 $k$ 時刻能夠打死的最多的鼴鼠。
但是被數據範圍卡死。完全開不開數組啊。
然後註意到題目中有句話說保證是按照時間遞增序輸入的。
想一下,某個鼴鼠能夠被打死,是因為他之前被打死的鼴鼠走過來的。
所以只需要考慮每個鼴鼠之前的若幹鼴鼠就可。只要兩個鼴鼠的距離小於它們出現的時刻只差,那就可以擴展的到。
附上代碼
#include <iostream> #include <cstring> #include <cstdio> usingnamespace std; const int maxn = 10003; int n, m, x[maxn], y[maxn], t[maxn], Ans = 1, dp[maxn]; inline int ABS(int x) { return x>0 ? x : -x; } int main() { cin>>n>>m; for(int i=1; i<=m; i++) { cin>>t[i]>>x[i]>>y[i]; dp[i] = 1;for(int j=i-1; j>=1; j--) if(ABS(x[j]-x[i])+ABS(y[j]-y[i]) <= t[i]-t[j]) dp[i] = max(dp[j]+1, dp[i]), Ans = max(Ans, dp[i]); } printf("%d", Ans); }
「 Luogu P2285 」打鼴鼠