传送门:洛谷 P1156 垃圾陷阱
算法分析:
\(dp[i][j]\) 表示吃了第 \(i\) 个垃圾后到 \(j\) 高度的最大生命值,则先判断能否活下来,如能,判断有没有跳出陷阱;若没有,就分两种情况:上升或活命。如果跳不出,就贪心求最大高度
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxN=100,maxH=100;
struct Node
{
int t,f,h;
}a[maxN+1];
int d,n,dp[maxN+1][maxN+1],ans=0;
inline int read();
bool comp(Node x,Node y)
{
return x.t<y.t;
}
int main()
{
d=read(); n=read();
memset(dp,-1,sizeof(dp));
for(int i=1;i<=n;i++)
{
a[i].t=read();
a[i].f=read();
a[i].h=read();
}
dp[0][0]=10;
sort(a+1,a+n+1,comp);
for(int i=1;i<=n;i++)
for(int j=0;j<=d;j++)
{
if(dp[i-1][j]<0) continue;
if(dp[i-1][j]>=a[i].t-a[i-1].t && j+a[i].h>=d)
{
printf("%d",a[i].t);
return 0;
}
if(dp[i-1][j]>=a[i].t-a[i-1].t)
{
dp[i][j+a[i].h]=dp[i-1][j]-a[i].t+a[i-1].t;
dp[i][j]=max(dp[i][j],dp[i-1][j]-a[i].t+a[i-1].t+a[i].f);
}
}
for(int i=1;i<=n;i++)
for(int j=0;j<=d;j++)
if(dp[i][j]!=-1) ans=max(ans,dp[i][j]+a[i].t);
printf("%d",ans);
return 0;
}
inline int read()
{
char ch=getchar();
int f=1,num=0;
while((ch<‘0‘ || ch>‘9‘) && ch!=‘-‘) ch=getchar();
if(ch==‘-‘) {f=-1; ch=getchar();}
while(ch>=‘0‘ && ch<=‘9‘)
{
num=num*10+ch-‘0‘;
ch=getchar();
}
return num*f;
}
原文:https://www.cnblogs.com/ezsyshx/p/10359337.html