题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176
与数塔类似,但采用自下而上的方法更好,更方面,状态转移方程:dp[i][j]=max{dp[i+1][j],dp[i+1][j-1],dp[i+1][j+1]}+value[i][j];
其中dp[i][j]表示第i秒时在位置j时包里的烧饼;
View Code
1 #include<iostream> 2 #include<algorithm> 3 const int N=100010; 4 using namespace std; 5 6 int value[N][11]; 7 int dp[N][11]; 8 9 int main(){ 10 int n; 11 while(scanf("%d",&n)!=EOF){ 12 if(n==0)break; 13 memset(dp,0,sizeof(dp)); 14 memset(value,0,sizeof(value)); 15 int x,t,_time=0; 16 for(int i=0;i<n;i++){ 17 scanf("%d%d",&x,&t); 18 value[t][x]++; 19 if(t>_time)_time=t; 20 } 21 int ans=0; 22 for(int i=_time;i>=0;i--){ 23 for(int j=0;j<11;j++){ 24 if(j==0){ 25 dp[i][j]=max(dp[i+1][j+1],dp[i+1][j])+value[i][j]; 26 }else if(j==10){ 27 dp[i][j]=max(dp[i+1][j-1],dp[i+1][j])+value[i][j]; 28 }else 29 dp[i][j]=max(dp[i+1][j],max(dp[i+1][j-1],dp[i+1][j+1]))+value[i][j]; 30 } 31 } 32 printf("%d\n",dp[0][5]); 33 } 34 return 0; 35 }