luogu P1156 垃圾陷阱 动态规划

性感 D a w n Dawn Dawn 在线日更
题面
康康题面 (算法标签 过后,这肯定是 d p dp dp
d p [ i ] [ j ] dp[i][j] dp[i][j]表示在第 i i i个垃圾 高度为 j j j时的血量
这题感觉顺推比较得劲
分为以下两种情况:
1. 1. 1.吃辣鸡: d p [ i + 1 ] [ j + a [ i + 1 ] . h ] = m a x ( d p [ i + 1 ] [ j + a [ i + 1 ] . h ] , d p [ i ] [ j ] − a [ i + 1 ] . t + a [ i ] . t ) dp[i+1][j+a[i+1].h]=max(dp[i+1][j+a[i+1].h],dp[i][j]-a[i+1].t+a[i].t) dp[i+1][j+a[i+1].h]=max(dp[i+1][j+a[i+1].h],dp[i][j]a[i+1].t+a[i].t)
2. 2. 2.堆垃圾: d p [ i + 1 ] [ j ] = m a x ( d p [ i + 1 ] [ j ] , d p [ i ] [ j ] − a [ i + 1 ] . t + a [ i ] . t + a [ i + 1 ] . f ) dp[i+1][j]=max(dp[i+1][j],dp[i][j]-a[i+1].t+a[i].t+a[i+1].f) dp[i+1][j]=max(dp[i+1][j],dp[i][j]a[i+1].t+a[i].t+a[i+1].f)
一些代码细节:
1. 1. 1.在求 d p dp dp的过程中 如果奶牛能撑到下一个垃圾垫过去并且垫过去直接出去时 直接输出并结束程序
2. 2. 2.如果求完 d p dp dp后 程序还没结束 说明出不去 那么就重新跑一遍 一直吃辣鸡 康康能挺多长时间
好像挺水的 但是这特坑点特别多:
1. 1. 1.初始值 d p [ 0 ] [ 0 ] dp[0][0] dp[0][0]要设为 10 10 10
2. 2. 2.当奶牛的血量为 0 0 0时 进入濒死状态 如果有人给辣鸡那么他就不会死…
ok 上代码

#include<bits/stdc++.h>
using namespace std;
int m,n,dp[101][101];
struct node{
    int t,f,h;
}a[101];
bool cmp(node a, node b){
    return a.t<b.t;
}
int sum,now=10;
int main(){
    cin>>m>>n;
    for(int i=1;i<=n;i++)cin>>a[i].t>>a[i].f>>a[i].h;
    sort(a+1,a+1+n,cmp);
    memset(dp,-1,sizeof(dp));
    dp[0][0]=10;
    for(int i=0;i<n;i++){
        for(int j=0;j<=m;j++){
            if(dp[i][j]<0)continue;
            if(j+a[i+1].h>=m&&dp[i][j]+a[i].t-a[i+1].t>=0){
                printf("%d\n",a[i+1].t);
                return 0;
            }
            if(dp[i][j]>=a[i+1].t-a[i].t){
                dp[i+1][j+a[i+1].h]=max(dp[i+1][j+a[i+1].h],dp[i][j]-a[i+1].t+a[i].t);
                dp[i+1][j]=max(dp[i+1][j],dp[i][j]-a[i+1].t+a[i].t+a[i+1].f);
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(now-a[i].t+a[i-1].t<0){
            printf("%d\n",sum+now);
            return 0;
        }
        now=now-a[i].t+a[i-1].t+a[i].f;
        sum=a[i].t;
    }
    printf("%d\n",sum+now);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值