題目鏈接
題目思路
感覺這個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;
}
