题目链接:
题目为:
6 5 1 4 1 6 1 7 2 7 2 8 3 0
4
则状态转移方程为:
dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j-1]),dp[i+1][j+1]);当在最边上时则单独考虑:
dp[i][0]+=max(dp[i+1][0],dp[i+1][1]);
dp[i][10]+=max(dp[i+1][9],dp[i+1][10]);
则代码为:
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> using namespace std; const int maxn=100000+10; int dp[maxn][11]; int main() { int i,j,n,Max,t,x; while(scanf("%d",&n)!=EOF&&n) { memset(dp,0,sizeof(dp)); Max=0; for(i=1;i<=n;i++) { scanf("%d%d",&x,&t); ++dp[t][x]; Max=max(Max,t); } for(i=Max-1;i>=0;i--) { for(j=1;j<=9;j++) { dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j-1]),dp[i+1][j+1]); printf("%d\n",dp[i][j]); } dp[i][0]+=max(dp[i+1][0],dp[i+1][1]); dp[i][10]+=max(dp[i+1][9],dp[i+1][10]); printf("%d %d\n",dp[i][0],dp[i][10]); } printf("%d\n",dp[0][5]); } return 0; }
原文:http://blog.csdn.net/u014303647/article/details/26285851