本文文旨,如题...

转载请注明出处...

 


 

HDOJ 1176 免费馅饼

http://acm.hdu.edu.cn/showproblem.php?pid=1176

类似数塔,从底往上推,每次都是从下面三个中选最大的

 1 #include<cstdio>
 2 #include<cstring>
 3 #define MAXN 100005
 4 int dp[MAXN][11];//第i秒第j个位置的馅饼数
 5 int max1(int a,int b)
 6 {
 7     return a>b?a:b;
 8 }
 9 int max2(int a,int b,int c)
10 {
11     return a>b?(a>c?a:c):(b>c?b:c);
12 }
13 int main()
14 {
15     int n,x,t,T;
16     while(~scanf("%d",&n))
17     {
18         if(n==0) break;
19         T=0;
20         memset(dp,0,sizeof(dp));
21         for(int i=1;i<=n;i++)
22         {
23             scanf("%d%d",&x,&t);
24             dp[t][x]++;
25             if(T<t) T=t;//时间不一定递增的,找到最大的时间
26         }
27         for(int i=T;i>=0;i--)//从底往上一层一层的加
28         {
29             for(int j=0;j<=10;j++)
30             {
31                 if(j==0) dp[i][j]+=max1(dp[i+1][0],dp[i+1][1]);
32                 else if(j==10) dp[i][j]+=max1(dp[i+1][9],dp[i+1][10]);
33                 else dp[i][j]+=max2(dp[i+1][j+1],dp[i+1][j],dp[i+1][j-1]);
34             }
35         }
36         printf("%d\n", dp[0][5]);//起始位置在5
37     }
38     return 0;
39 }
View Code

相关文章: