题目链接
题目思路
感觉这个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;
}