打鼹鼠 bzoj-1207 HNOI-2004
题目大意:题目链接。
注释:略。
想法:
$dp_i$表示打到了第$i$个鼹鼠时最多打了多少个鼹鼠。
$O(n)$转移即可。
总时间复杂度$O(n^2)$。
Code:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define N 10010 using namespace std; struct Node {int tm,x,y;}a[N]; int dp[N]; inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;} int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;} int main() { int n=rd(),m=rd(); for(int i=1;i<=m;i++) { a[i].tm=rd(),a[i].x=rd(),a[i].y=rd(); dp[i]=1; for(int j=1;j<i;j++) if(abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y)<=a[i].tm-a[j].tm) { dp[i]=max(dp[i],dp[j]+1); } } int ans=0; for(int i=1;i<=m;i++) ans=max(ans,dp[i]); printf("%d ",ans); return 0; }
小结:水题。