6 5 1 4 1 6 1 7 2 7 2 8 3 0
4状态方程:注意边界问题if(j<10&&j>0)dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j+1],dp[i-1][j]))+a[i][j]; else if(j==10) dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j]; else if(j==0) dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+a[i][j];#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> using namespace std; #define maxn 100005 #define inf 0x3f3f3f3f int dp[maxn][11]; int a[maxn][11]; int main() { int n; int x[maxn],t[maxn]; freopen("in.txt","r",stdin); while(~scanf("%d",&n)&&n){ int maxt=0; memset(a,0,sizeof a); memset(dp,0,sizeof dp); for(int i=1;i<=n;i++){ scanf("%d%d",&x[i],&t[i]); a[t[i]][x[i]]++; if(t[i]>maxt)maxt=t[i]; } dp[1][4]=a[1][4]; dp[1][5]=a[1][5]; dp[1][6]=a[1][6]; for(int i=2;i<=maxt;i++) for(int j=0;j<=10;j++){ if(j<10&&j>0)dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j+1],dp[i-1][j]))+a[i][j]; else if(j==10) dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j]; else if(j==0) dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+a[i][j]; } int maxs=0; for(int i=0;i<=10;i++){ maxs=max(maxs,dp[maxt][i]); } printf("%d\n",maxs); } }
原文地址:http://blog.csdn.net/u013497977/article/details/44496255