hdu 免费馅饼

题目,点击打开
我认为可以用两个数组储存,a与f设a[i][j]为第i秒的j位置掉下的馅饼数量,
f[i][j]为第i秒在j位置接馅饼最多可以接到的最多馅饼数量。
然后就是关于移动。因为gameboy一秒移动一个单位,故一秒可到位置是
f[i-1][j-1]
f[i-1][j]
f[i-1][j+1]
自己复习了dp后,自己也学会了一点,发现每一个算法都有状态转移方程,
这题应该是一个背包,所以,在思索了30多分钟(可怜的孩子)后,终于
想出来了此题的状态转移方程:
f[i][j]=max(f[i-1][j-1],f[i-1][j],f[i-1][j+1])+a[i][j];
但是,还有一种简单的方法,数塔问题都听过吧,这题算是dp与递推的入门题,采用动态规划自底向上计算,如果我们要知道所走之和最大,那么最后一步肯定是走最后一排数其中一个,向上退,倒数第二步肯定走最后一排数对应的倒数第二排最大的一个(将最后对应最后步走的最大的数加起来存在倒数第二步的数组中)再向上推,一直推到最上面的第0步,那么dp[0][0]最后所存的结果一定是最大的。
那这题也是一样的,把秒数当行,距离当列,先储存,在数塔,解决。
标码

#include <iostream>  
#include <cstdio>  
#include <algorithm>  

using namespace std;  

const int maxn = 100005;  

int a[maxn][12];  
int f[maxn][12];  
int maxT;  
int dp(){  
    int i;  
    int j;  
    int maxSum = -9;
    f[1][4] = a[1][4];
    f[1][5] = a[1][5];  
    f[1][6] = a[1][6];  
    for(i = 2 ; i <= maxT ; ++i){  
        for(j = 0 ; j < 11 ; ++j){  
            f[i][j] = f[i-1][j];  

            if(j > 0){  
                f[i][j] = max(f[i][j],f[i-1][j-1]);  
            }  
            if(j < 10){  
                f[i][j] = max(f[i][j],f[i-1][j+1]);  
            }  
            f[i][j] += a[i][j];  
        }  
    }  
    for(i = 1 ; i <= maxT ; ++i){  
        for(j = 0 ; j < 11 ; ++j){  
            if(maxSum < f[i][j]){  
                maxSum = f[i][j];  
            }  
        }  
    }  

    return maxSum;  
}  


int main(){  
    int n;  
    while(scanf("%d",&n)!=EOF,n){  
        memset(a,0,sizeof(a));  
        memset(f,0,sizeof(f));  
        int i;  
        for(i = 1 ; i <= n ; ++i){  
            int x,t;  
            scanf("%d%d",&x,&t);  
            a[t][x]++;  

            maxT = max(maxT,t);  
        } 
        printf("%d\n",dp());  
    }  

    return 0;  
}  

注:不用scanf好像超时。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值