1. 程式人生 > >「 Luogu P2285 」打鼴鼠

「 Luogu P2285 」打鼴鼠

std 位置 解題思路 str -- code stream 但是 clas

解題思路

第一眼看上去覺得要設計一個三維的 DP,$dp[i][j][k]$ 表示在 $(i,j)$ 這個位置上 $k$ 時刻能夠打死的最多的鼴鼠。

但是被數據範圍卡死。完全開不開數組啊。

然後註意到題目中有句話說保證是按照時間遞增序輸入的。

想一下,某個鼴鼠能夠被打死,是因為他之前被打死的鼴鼠走過來的。

所以只需要考慮每個鼴鼠之前的若幹鼴鼠就可。只要兩個鼴鼠的距離小於它們出現的時刻只差,那就可以擴展的到。

附上代碼

#include <iostream>
#include <cstring>
#include <cstdio>
using
namespace 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 」打鼴鼠