学习了大佬题解
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int d,g,dp[2][2510],maxn;
struct trash{
int t,f,h;
bool operator<(const trash&rhs)const{
return t<rhs.t;}
}tr[110];
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&d,&g);
for(int i=1;i<=g;i++)
scanf("%d%d%d",&tr[i].t,&tr[i].f,&tr[i].h);
sort(tr+1,tr+g+1);
dp[0][0]=10;
for(int i=1,pre=0,cur=1;i<=g;i++,pre^=1,cur^=1)
{
memset(dp[cur],0xcf,sizeof(dp[cur]));
for(int j=d;j>=0;j--)
{
if(dp[pre][j]<tr[i].t-tr[i-1].t)continue;
if(j+tr[i].h>=d)
{
printf("%d\n",tr[i].t);
return 0;
}
dp[cur][j+tr[i].h]=max(dp[cur][j+tr[i].h],dp[pre][j]-(tr[i].t-tr[i-1].t));
dp[cur][j]=max(dp[cur][j],dp[pre][j]+tr[i].f-(tr[i].t-tr[i-1].t));
}
maxn=max(maxn,dp[cur][0]+tr[i].t);
}
printf("%d\n",maxn);
return 0;
}
总结
状态的定义很重要,当一种状态不好处理时尝试另一种状态。