动态规划
定义 dp[i][0] 和 dp[i][1] 两个状态:
dp[i][0]:Askalana 到达表世界第 i 号点时,能拥有的最大金币数。dp[i][1]:Askalana 到达里世界第 i 号点时,能拥有的最大金币数。dp[1][0] = a[1](初始在表世界 1 号点,拾取该点金币)。- 其余状态(如
dp[1][1])初始化为 “不可达”。
初始化
只有初始状态可达:
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
using ll = long long;
#define all(a) a.begin(), a.end()
void init()
{
}
ll dp[200010][2];
void solve()
{
ll n, k;
cin >> n >> k;
memset(dp, -0x3f3f, sizeof(dp));
vector<int> 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];
}
dp[1][0] = a[1];
for (int i = 2; i <= n; i++)
{
dp[i][0] = dp[i - 1][0];
dp[i][1] = dp[i - 1][1];
if (dp[i - 1][1] > k)
dp[i][0] = max(dp[i][0], dp[i - 1][1] - k);
if (dp[i - 1][0] > k)
dp[i][1] = max(dp[i][1], dp[i - 1][0] - k);
dp[i][1] += b[i];
dp[i][0] += a[i];
}
cout << max(dp[n][1], dp[n][0]) << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
init();
int qwq = 1;
// cin >> qwq;
while (qwq--)
{
solve();
}
return 0;
}

京公网安备 11010502036488号