垃圾陷阱

垃圾陷阱

luogu P1156
垃圾陷阱_第1张图片

类似01背包问题
dp[i][j]表示第i个垃圾投下后,在高度j处能量的最大值。
i+1个垃圾扔下后两种状态(如果当前i处的能量能够到达i+1扔下的时间t)

  • 吃下垃圾:dp[i+1][j]=dp[i][j]+a[i+1].f
  • 垫高度:dp[i+1][j+a[i+1].h]=dp[i][j]

如果i+1到达的高度能够大于等于d,直接输出答案:i+1落下的时间
无法到达高度d取答案ans并输出
记得排序

int d,g;
struct node{
    int t,f,h;
}a[maxn];
bool cmp(node a,node b){
    return a.t<b.t;
}
int dp[maxn][maxn];
int main(){
    d=ird();g=ird();
    for(int i=1;i<=g;i++){
        a[i].t=ird();
        a[i].f=ird();
        a[i].h=ird();
    }
    sort(a+1,a+1+g,cmp);
    int ans=0;
    dp[0][0]=10;
    for(int i=0;i<g;i++){
        for(int j=d;j>=0;j--){
            if(dp[i][j]>=a[i+1].t){
                dp[i+1][j]=max(dp[i+1][j],dp[i][j]+a[i+1].f);
                dp[i+1][j+a[i+1].h]=max(dp[i+1][j+a[i+1].h],dp[i][j]);
                if(j+a[i+1].h>=d){
                    cout<<a[i+1].t<<endl;
                    return 0;
                }
            }
        }
        ans=max(ans,dp[i][0]);
    }
    ans=max(ans,dp[g][0]);
    cout<<ans<<endl;
    return 0;
}

你可能感兴趣的:(DP)