牛客网第十五届浙江大学宁波理工学院程序设计大赛(同步赛)L题The Last Stand

牛客网第十五届浙江大学宁波理工学院程序设计大赛(同步赛)

The Last Stand

题意不在描述

分析:

简单dp

​ dp[i]表示经过第i个点时候的最大能量(不选)

那么

dp[i]=max(dp[j]+val[j]+(pos[i]pos[j])delta[j]),0<=j<idp[i]=max(dp[j]+val[j]+(pos[i]-pos[j])*delta[j]), 0<=j<i

初始令

val[0]=h,delta[0]=0;dp[0]=h

求dp[n+1]即可

#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<iostream>
#include<iomanip>
#include<map>
#include<vector>
#define mset(a,b)   memset(a,b,sizeof(a))
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxn=1e3+10;
const int branch=26;
const int inf=0x3f3f3f3f;
ll pos[maxn],val[maxn],delta[maxn];
ll dp[maxn];
int main()
{
    int n,ans,h,t,pp,m,vv,dd;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d %d",&n,&m,&h);
        mset(dp,0);
        for(int i=1; i<=n; ++i)
            scanf("%lld %lld %lld",pos+i,val+i,delta+i);
        pos[0]=0;
        val[0]=0;
        delta[0]=0;
        dp[0]=h;
        pos[n+1]=m;
        val[n+1]=0;
        delta[n+1]=0;
        for(int i=0; i<=n+1; ++i)
        {
            for(int j=0; j<i; ++j)
            {
                if(dp[j]+val[j]>0)//走到这个点之前选择的是j这个点
                {
                    dp[i]=max(dp[i],dp[j]+(pos[i]-pos[j])*delta[j]+val[j]);
                }

            }
        }

        printf("%lld
",dp[n+1]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/dchnzlh/p/10427271.html