【Kuangbin简单DP】挤奶时间

4561. 挤奶时间 - AcWing题库

题意:

思路:

一开始的思路是把这么多的区间当作物品,然后选与不选,这样去搞线性DP

显然是不行的,因为这样答案就不知道怎么统计了

而且,我们是设阶段!!按字面去理解,怎么可能把区间当作阶段啊

怎么按字面理解,其实就是去心里模拟一下过程,看看子问题就好了

应该是以时间当作阶段去定义状态

设dp[i]表示时刻 i 以内的最大挤奶量

然后去考虑转移

首先最大挤奶量一定大于等于前一个时刻的,因此dp[i]=dp[i-1]

题目的限制是,选择一个区间后,这个区间的右端点之后的 R 时间之后才能再选区间

 所以这个时刻应该从这个时刻所在区间的左端点之前R的区间转移过来

所以我们需要预处理一个时刻作为右端点的区间的左端点和贡献c

Code:

#include <bits/stdc++.h>
using namespace std;
const int mxn=1e6+10;
vector<pair<int,int> > v[mxn];
int n,m,r,a,b,c;
int dp[mxn];
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m>>r;
    for(int i=1;i<=m;i++){
        cin>>a>>b>>c;
        v[b].push_back({a,c});
    }
    for(int i=1;i<=n;i++){
        dp[i]=dp[i-1];
        for(auto it:v[i]){
            dp[i]=max(dp[i],dp[max(it.first-r,0)]+it.second);
        }
    }
    cout<<dp[n]<<'\n';
}

总结:

状态设计又加了个trick:按字面意思去设计阶段,不要嗯线性设计

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值