#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+10;
ll a[N];
ll b[N];
ll dp[N][2];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
dp[1][0]=a[1];
dp[1][1]=0;
for(int i=2;i<=n;i++)
{
if(dp[i-1][0]>=k)dp[i][1] = max(dp[i-1][1],dp[i-1][0]-k)+b[i];
else if(dp[i-1][1]!=0)dp[i][1] = dp[i-1][1]+b[i];
if(dp[i-1][1]>=k)dp[i][0] = max(dp[i-1][0],dp[i-1][1]-k)+a[i];
else dp[i][0] = dp[i-1][0]+a[i];
}
ll ans = max(dp[n][0],dp[n][1]);
cout<<ans<<'\n';
return 0;
}
时间复杂度O(n),dp,dp[i][0]表示在i号点的表世界能获得的最大收益,dp[i][1]表示在里世界能获得的最大收益,唯一需要注意的点是,只有魔法师能够到达里世界,我们才进行里世界的状态转移,所以我加了个else if语句,不等于0表示进入过dp[i-1][1]里面了,这时候我们就进行状态转移

京公网安备 11010502036488号