1.题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1176
状态方程:dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j]),dp[i+1][j+1]);
2.参考代码:
#include <stdio.h>
#include <string.h>
#define N 100001
int dp[N][20]; ///二维数组每个的长度不要太大,否则会超内存
int m;
int max(int i,int j){return i>j?i:j;}
int dfs(){
int i,j;
for(i=m-1;i>=0;i--) ///从倒数第二层开始
{
for(j=0;j<11;j++)
dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j]),dp[i+1][j+1]); ///相邻2个还有自己的别忘记了!
}
return dp[0][5];
}
int main()
{
int n,a,b;
while(~scanf("%d",&n))
{
if(n==0)
break;
memset(dp,0,sizeof(dp));
m=0; ///m是记录有几层,记得是从0开始的
while(n--)
{
scanf("%d %d",&a,&b);
if(m<b)
m=b;
dp[b][a]++;
}
printf("%d\n",dfs());
}
return 0;
}