hdu1176 dp

题意:在一条 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

 

你可能感兴趣的:(HDU)