http://acm.hdu.edu.cn/showproblem.php?pid=1176
乍一看和塔数很像(http://www.cnblogs.com/sjy123/p/3241995.html),其实就是很像,一个升级版的塔数。
-----------------------------------------------分割线--------------------------------------------------
5 t=0
456 t=1
34567 t=2
2345678 t=3
123456789 t=4
012345678910 t=5
012345678910 t=6
总体来说,这道题就是上面这样的塔数,很明显,第i层的0只能从上一层的0,1中最大的来,倒推的话,也是一样的,第i层的0也只能由下一层的0,1来,(t=5之前实际没有0,因为走不到那,但是我们可以假设有),同理,每行的10也只能有下一行9,10推出来。
-----------------------------------------------分割线------------------------------------------------
#include"stdio.h" #include"stdlib.h" int dp[100110][11]; int maxabc(int a,int b) { int max; max=a>b?a:b; return max; } int main() { int n,i,j,tmax,x,y; while(scanf("%d",&n)&&n) { for(i=0;i<100110;i++) //初始化 for(j=0;j<11;j++) dp[i][j]=0; for(i=0;i<n;i++) { scanf("%d%d",&x,&y); if(i==0) tmax=y; //记录最后出现时间 else if(y>tmax) tmax=y; dp[y][x]++; } for(i=tmax-1;i>=0;i--) //倒推 { dp[i][0]+=dp[i+1][0]>dp[i+1][1]?dp[i+1][0]:dp[i+1][1]; dp[i][10]+=dp[i+1][9]>dp[i+1][10]?dp[i+1][9]:dp[i+1][10]; for(j=1;j<=9;j++) dp[i][j]+=maxabc(dp[i+1][j-1],maxabc(dp[i+1][j],dp[i+1][j+1])); } printf("%d ",dp[0][5]); } //system("pause"); }