K Box(“范式杯”2023牛客暑期多校训练营2)

目录

题目详细:

解题思路:

代码详解:


题目详细:

K Box(“范式杯”2023牛客暑期多校训练营2)_第1张图片

解题思路:

注:

1.这里的最终状态为对所有盖子进行操作(左移、右移或者不移)完后的最终状态,

2.这里对于f[i][j]并不是由其他状态转移得到 f[i][j] ,而是对于 f[i][j] 所对应状态进行划分,枚举完所有能进行的操作并取最大值

K Box(“范式杯”2023牛客暑期多校训练营2)_第2张图片

代码详解:

注:这里状态转移的代码不能改变顺序,否则对于 f[i][j] 的含义就会发生改变

#include 
using namespace std;
typedef long long ll;

const int N=1e6+6;

ll a[N],b[N];
ll f[N][2];

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
    
    for(int i=1;i<=n;i++){
        f[i][0]=max(f[i-1][0],f[i-1][1]);//(1)
        //因为没有盖子,所以最大值等于前一项的最大值
        if(b[i]){
            f[i+1][1]=max(f[i][0],f[i][1])+a[i+1];//(2)
            //f[i][0]:第i个没有盖子 f[i][1]:第i个有盖子且第i个盖子由i-1个右移得来
            f[i][1]=max(f[i][1],f[i][0]+a[i]);//(3)
            //f[i][1]:第i个有盖子且第i个盖子由i-1个右移得来 f[i][0]:第i个没有盖子
            f[i][0]=max(f[i-1][0]+a[i-1],f[i][0]);//(4)
            //f[i-1][0]:第i个盖子移动给第i-1,且第i-1原本没有盖子 f[i][0]:第i个没有盖子
        }
    }
    
    cout<

 

你可能感兴趣的:(每日一题分享,算法,dp)