题意
给出两个数组,在这两个数组中取一些数使总和达到最大,取的规则是不能取相邻的数。
思路
dp
开一个二维的dp数组,dp[2][100010],第一位 0 表示取第一行,1表示取第二行
状态转移方程
dp[0][i] = max(a[i] + dp[1][i - 1], dp[0][i - 1]);
dp[1][i] = max(b[i] + dp[0][i - 1], dp[1][i - 1]);
例如,取第一行的第 i 个数,那么上个数(i - 1)只能取第二行的数;如果不取这个数,那么上个数取第一行的数;在两种情况中取最大值,最后在dp[ 0 ][ n ] 和 dp[ 1 ][ n ] 中的最大值就是答案
代码
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int a[100100], b[100100];
long long dp[2][100100];
int main(){
int n;
scanf("%d", &n);
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++){
dp[0][i] = max(a[i] + dp[1][i - 1], dp[0][i - 1]);
dp[1][i] = max(b[i] + dp[0][i - 1], dp[1][i - 1]);
}
printf("%lld\n", max(dp[0][n], dp[1][n]));
}