The Boomsday Project 题解(玄学dp)

题目链接

题目思路

感觉这个dp有点阴间

只可意会不能言传

\(pre[i]\)表示第\(i\)张优惠卷上次是在第\(i\)天用

\(dp\)的正确性还是很显然,但是这种写法还是第一次见

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
//typedef pair<int,int> pii;
#define fi first
#define se second
#define debug printf("aaaaaaaaaaa\n");
const int maxn=6e5+5,inf=0x3f3f3f3f,mod=998244353;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n,m,r;
ll dp[maxn];
int d[maxn],k[maxn],c[maxn];
int pre[maxn];
int a[maxn];
int main(){
    scanf("%d%d%d",&n,&m,&r);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&d[i],&k[i],&c[i]);
        pre[i]=1;// 第1天使用
    }
    int cnt=0;
    for(int i=1,p,q;i<=m;i++){
        scanf("%d%d",&p,&q);
        while(q--){
            a[++cnt]=p;
        }
    }
    sort(a+1,a+1+cnt);
    for(int i=1;i<=cnt;i++){
        dp[i]=dp[i-1]+r;
        for(int j=1;j<=n;j++){
            while(a[pre[j]]+d[j]-1<a[i]||pre[j]+k[j]-1<i){
                pre[j]++;
            }
            dp[i]=min(dp[i],dp[pre[j]-1]+c[j]);
        }
    }
    printf("%lld\n",dp[cnt]);
    return 0;
}

不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/15053976.html