zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    53     }
    54     return 0;
    55 }
    View Code
  • 相关阅读:
    Putty完全使用方法
    TCP端口扫描
    XSS学习笔记
    SQL漏洞学习笔记
    Codeforces Round #263 (Div. 1)
    hdu4987A simple probability problem.(凸包)
    Codeforces Round #262 (Div. 2)
    hdu3228Island Explorer
    hdu2297Run(凸包的巧妙应用)
    poj3301Texas Trip(三分)
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4293455.html
Copyright © 2011-2022 走看看