码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1176 dp

时间:2015-02-15 21:47:40      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

题意:在一条 0 ~ 10 的坐标轴上,在整数点上会掉烙饼,一个人第 0 秒站在坐标 5 处,每秒他能够左右移动一个单位的坐标或不移动,并接住该坐标位置当前时间落下的烙饼,(例如第0秒他在坐标5处,第一秒他能在坐标4或5或6处,并接到该点第一秒落下的饼,同一个点同一秒可以落下多个饼),问最多能够接到多少饼

我的做法是以 dp [ i ] [ j ] 表示在坐标 i 处第 j 秒能接到的饼的最优情况。转移时由上一秒种能够移动到 i 点的最大 dp 值转移过来,并且加上当前能够拿到的最大值(这是我的第一思路,但事实上题目描述并不是这样,他只能捡到他移动到的点当前时间掉落的烙饼,而我以为可以捡到左中右三格上最大的一格,所以orzWA五连发```)。

dp[ i ] [ j ] = max ( dp [ i - 1 ] [ j - 1 ] , dp [ i ] [ j - 1 ] , dp [ i + 1 ] [ j - 1 ] ) + a [ i ] [ j ];当然, i + 1, i - 1 都必须保证在 0 ~ 10 范围内且第 j - 1 秒是能够达到的。

 

当然,我看其他人的题解其实都是从最后一秒向第 0 秒推,我看完之后也觉得可能比我的做法更加优化,因为这样就不需要考虑那一秒的时候是否能够达到那个点了。

自己还是太弱了,中问题都看不懂了啊!

 

技术分享
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define max(a,b) a>b?a:b
 4 
 5 int a[11][110000],dp[12][110000];
 6 
 7 int main(){
 8     int n;
 9     while(scanf("%d",&n)!=EOF&&n!=0){
10         memset(a,0,sizeof(a));
11         memset(dp,-1,sizeof(dp));
12         int i,j,x,t,m=0,k,ans=0;
13         for (i=1;i<=n;i++){
14             scanf("%d%d",&x,&t);
15             a[x][t]++;
16             if(t>m)m=t;
17         }
18         dp[5][0]=a[5][0];
19         ans=max(ans,dp[5][0]);
20 /*        dp[5][1]=max(a[5][1],a[4][1]);
21         dp[5][1]=max(dp[5][1],a[6][1]);
22         ans=dp[5][1];
23         dp[5][1]=dp[5][0];
24         dp[5][1]+=a[5][1];
25         ans=max(dp[5][1],ans);
26 */        for(t=1;t<=m;t++){
27             for(i=0;i<=10;i++){
28                 for(j=i-1;j<=i+1;j++){
29                     if(0<=j&&j<=10&&dp[j][t-1]>=0){
30                         dp[i][t]=max(dp[i][t],dp[j][t-1]);
31                     }
32                 }
33 /*                int m0=0;
34                 for(j=i-1;j<=i+1;j++){
35                     if(0<=j&&j<=10){
36                         m0=max(m0,a[j][t]);
37                     }
38                 }
39 */                if(dp[i][t]>=0){
40                 /*    int m0=0;
41                     for(j=i-1;j<=i+1;j++){
42                         if(0<=j&&j<=10){
43                             m0=max(m0,a[j][t]);
44                         }
45                     }*/
46                     dp[i][t]+=a[i][t];
47                 }
48 //                dp[i][t]+=m0;
49                 ans=max(ans,dp[i][t]);
50             }
51         }
52         printf("%d\n",ans);
53     }
54     return 0;
55 }
View Code

 

hdu1176 dp

标签:

原文地址:http://www.cnblogs.com/cenariusxz/p/4293455.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!