[DP]BZOJ 1270 [BeijingWc2008]雷涛的小猫

DP算法解析:最大柿子数问题
本文介绍了一个有趣的DP题目,通过分析状态方程dp[i][j](第i棵树高度为j时的最大柿子数目),给出了具体的实现代码,并详细解释了转移方程的推导过程。

感觉是一道很有意思的DP题目。

题目的状态方程并不难推(毕竟题目就两个有用信息量啊)

dp[i][j] 表示第i颗树 高度为j时的 最大柿子数目。

一开始转移方程推错了,后来仔细思考才发现 自己果然是菜啊~

因为可以从一棵树跳到任意一棵树 所以 这一步需要思考搞

再处理一下 从这颗树j高度到j-1高度就可以了

 

#include <cstdio>
#include <algorithm>
#include <cstring>
using std::max;
int n,h,Down;
int Tree[3555][2222];
int dp[3555][6666];

inline int Read(){
    int ans = 0 , flag = 1;
    char ch = getchar() ;
    while(ch > '9' || ch < '0'){
        if(ch == '-') flag = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        ans = ans * 10 + ch - '0';
        ch = getchar();
    }
    return flag * ans;
}

int main(){
    n = Read();
    h = Read();
    Down = Read();
    for(int i=1;i<=n;++i){
        int x = Read();
        for(int j=1;j<=x;++j){
            int y = Read();
            Tree[i][y]++;
        }
    }
    for(int j=h;j>=0;j--){
        int MAX = 0;
        for(int i=1;i<=n;i++){
            MAX = max(MAX,dp[i][j+Down]);
        }
        for(int i=1;i<=n;i++){
            dp[i][j] = max(dp[i][j+1],MAX)+Tree[i][j];
        }
    }
    /*for(int j=h;j>=0;j--){
        for(int i=1;i<=n;i++){
            printf("dp[%d][%d]:%d\n",i,j,dp[i][j]);
        }
    }*/
    int Max = 0;
    for(int i=1;i<=n;i++) Max = max(Max,dp[i][0]);
    printf("%d\n",Max);
    return 0;
}
跑了5216 ms的程序

 

转载于:https://www.cnblogs.com/OIerLYF/p/7544367.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值