标签:dp
递推方程应该很好想,就是初值处理起来有点麻烦。在草稿纸上模拟一下就可以了
dp[i][j]表示i时刻处于j位置能接到的最大值
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[100005][15],dp[100005][15]; void init(){ memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); for(int i=0;i<5;i++){ for(int j=0;j<=10;j++) dp[i][j]=-1; } for(int i=0;i<5;i++){ for(int j=5-i;j<=5+i;j++){ dp[i][j]=0; } } } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int n,x,t; while(scanf("%d",&n),n){ int maxt=0; init(); for(int i=1;i<=n;i++) { scanf("%d%d",&x,&t); maxt=max(maxt,t); a[t][x]++; } for(int i=1;i<=maxt;i++){ for(int j=0;j<=10;j++){ if(j-1>=0&&dp[i-1][j-1]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[i][j]); if(dp[i-1][j]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i][j]); if(j+1<=10&&dp[i-1][j+1]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j+1]+a[i][j]); } } int ans=0; for(int i=0;i<=10;i++) ans=max(ans,dp[maxt][i]); printf("%d\n",ans); } }
标签:dp
原文地址:http://blog.csdn.net/lj94093/article/details/45288125