洛谷 P1156 垃圾陷阱

传送门:洛谷 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;
}
posted @ 2019-02-10 15:53  常青藤的花语  阅读(129)  评论(0编辑  收藏  举报

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。