题解:
f[i][j]表示用了前i个垃圾,垫高j的高度后,还能存活的时间(注意:不是总共能存活的时间)
初始化:f[0][0]=10,其他都是负无穷
状态转移方程:
1.吃垃圾 f[i][j]=max(f[i][j],f[i-1][j]-a[i].T+a[i-1].T+a[i].F)
2.垃圾垫脚 f[i][j]=max(f[i][j],f[i-1][j-a[i].H]-a[i].T+a[i-1].T)
但在转移前要判断是否可行。
注意:要先根据时间来排序
标程:
#include<bits/stdc++.h>
using namespace std;
struct kk{
int T,F,H;
}a[103];
int i,j,ans,n,m,f[103][103];
int cmp(kk x1,kk y1){
return x1.T<y1.T;
}
int main(){
cin>>m>>n;
for (i=1;i<=n;i++) scanf("%d%d%d",&a[i].T,&a[i].F,&a[i].H);
sort(a+1,a+n+1,cmp);
for (i=0;i<=n;i++)
for (j=0;j<=m;j++) f[i][j]=-999999999;
f[0][0]=10;
for (i=1;i<=n;i++)
for (j=0;j<=m;j++){
if (f[i-1][j]-a[i].T+a[i-1].T>=0) f[i][j]=max(f[i][j],f[i-1][j]-a[i].T+a[i-1].T+a[i].F);
if (j>=a[i].H && (f[i-1][j-a[i].H]-a[i].T+a[i-1].T>=0)){
f[i][j]=max(f[i][j],f[i-1][j-a[i].H]-a[i].T+a[i-1].T);
if (j==m){
cout<<a[i].T;
return 0;
}
}
}
for (i=0;i<=n;i++)
for (j=0;j<=m;j++) ans=max(ans,f[i][j]+a[i].T);
cout<<ans;
}