hdu 1176

题目链接: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 }

 

posted @ 2013-03-11 18:54  ihge2k  阅读(484)  评论(0编辑  收藏  举报