小偷题解

小偷题解

一个裸的背包,不过加了一点限制,
鬼知道他为什么被评为紫题
从后向前转移,每次将大于限制时间的清空即可。
即便如此简单,我还调了这么久,我太弱了,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;
}
posted @ 2019-10-12 07:05  lsoi_ljk123  阅读(114)  评论(0编辑  收藏  举报