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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM