华丽转身 题解(dp)

题目大意

给你n次考试,m个人,你可以控制自己在第i次考试的名次为\([l[i],r[i]]\)

若第i-1次考试排名x,第i次考试排名为y

若y<=x/2 则可以获得num[i]的值

求你通过控制自己的名次最终可以获得的值

题目思路

设dp[i]为经历1-i次考试后的最大值

表述好难啊......

感觉看代码可以理解

复杂度为\(O(n*62)\)

代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const int eps=1e-6;
ll n,m,ans;
ll l[maxn],r[maxn],num[maxn];
ll dp[maxn];
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>l[i]>>r[i]>>num[i];
    }
    for(int i=1;i<=n;i++){
        ll cur=l[i],sum=0;
        dp[i]=dp[i-1];
        for(int j=i-1;j>=1;j--){
            cur*=2;
            if(cur>r[j]) break;
            cur=max(cur,l[j]);
            sum+=num[j+1];
            dp[i]=max(dp[i],dp[j-1]+sum);
        }
    }
    cout<<dp[n]<<endl;
    return 0;
}

不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/14354656.html