题解 CF358D 【Dima and Hares】
littleseven · · 题解
CF 358D Dima and Hares
题目链接:洛谷 CF 358D Dima and Hares CF 358D Dima and Hares
算法标签: DP、思维
题目描述:
上图理解:
这样第一个问题就解决了,那么怎么解决第二个问题:
首先因为每次取最大值,不妨设所有的
之后对于第一个点,由于它前边没有点,所以一定会先取这个点:
对于最后一个点,由于他后边没有点,那么我们假设后边有一个点(由于状态当中
现在状态有了,初值有了,转移方程有了,答案也有了,直接写dp就解决了。
AC代码
#include <bits/stdc++.h>
using namespace std;
#define setI(x) freopen(x".in", "r", stdin);
#define setO(x) freopen(x".out", "w", stdout);
#define setIO(x) setI(x) setO(x);
const int N = 100100;
typedef long long ll;
int n, a[N], b[N], c[N];
ll dp[N][2];
void rd() {
for (int i = 1; i <= n; i ++ ) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= n; i ++ ) {
scanf("%d", &b[i]);
}
for (int i = 1; i <= n; i ++ ) {
scanf("%d", &c[i]);
}
}
int main() {
// setIO("cow");
scanf("%d", &n);
rd();
memset(dp, -0x3f, sizeof dp);
dp[1][0] = 0;
for (int i = 2; i <= n + 1; i ++ ) {
dp[i][0] = max(dp[i - 1][0] + b[i - 1], dp[i - 1][1] + c[i - 1]);
dp[i][1] = max(dp[i - 1][0] + a[i - 1], dp[i - 1][1] + b[i - 1]);
}
cout << dp[n + 1][1] << endl;
return 0;
}