dp 初始下开始情况
有四种前进的情况
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,k;
cin>>n>>k;
vector<ll> a(n+1),b(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
vector<vector<ll>> dp(n+1,vector<ll> (2,-1));
dp[1][0]=a[1];
dp[1][1]=-1;
for(int i=2;i<=n;i++){
if(dp[i-1][0]!=-1){
dp[i][0]=max(dp[i][0],dp[i-1][0]+a[i]);
}
if(dp[i-1][1]!=-1&&dp[i-1][1]>=k){
dp[i][0]=max(dp[i][0],dp[i-1][1]-k+a[i]);
}
if (dp[i-1][1]!=-1){
dp[i][1]=max(dp[i][1],dp[i-1][1]+b[i]);
}
if (dp[i-1][0]!=-1&&dp[i-1][0]>=k){
dp[i][1]=max(dp[i][1],dp[i-1][0]-k +b[i]);
}}
cout<<max(dp[n][1],dp[n][0]);
return 0;
}
// 64 位输出请用 printf("%lld")

京公网安备 11010502036488号