小偷题解
小偷题解
一个裸的背包,不过加了一点限制,
鬼知道他为什么被评为紫题
从后向前转移,每次将大于限制时间的清空即可。
即便如此简单,我还调了这么久,我太弱了,WuWuWu
#include<bits/stdc++.h>
using namespace std;
const int N=1006,M=52;
int n,m,dp[N],t[M],num=1,ans=0;
struct xd{int i,c,v;}q[M<<1];
inline int read(){
int T=0,F=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') F=-1; ch=getchar();}
while(ch>='0'&&ch<='9') T=(T<<3)+(T<<1)+(ch-48),ch=getchar();
return F*T;
}
bool cmp(xd u,xd v){return u.i>v.i;}
int main(){
n=read(),m=read();
for(int i=1;i<=n;++i) t[i]=read();
for(int i=1;i<=m;++i) q[i].i=read()+1,q[i].v=read(),q[i].c=read();
sort(q+1,q+m+1,cmp),t[n+1]=1001;
for(int i=n;i>=1;--i){
while(num<=m&&q[num].i==i){
for(int j=q[num].c;j<t[q[num].i];++j) dp[j]=max(dp[j],dp[j-q[num].c]+q[num].v);
++num;
}
for(int j=t[i];j<t[i+1];++j) dp[j]=0;
}
for(int i=0;i<t[1];++i) ans=max(ans,dp[i]);
printf("%d\n",ans);
return 0;
}