Description
N个数的序列,选出任意个,要求不能相邻,求不相邻的最大和。
Input
第一行是一个正整数 N。
第二行是N 个用空格隔开的正整数。
Output
只有一个正整数,为不相邻的最大和。
Sample Input
5
3 10 8 20 21
Sample Output
32
5≤n≤1000000
1≤每个数≤500
题目分析:
这个很明显是一道DP题qwq
因为对一个数,我们有两个选择,那便是需要2个维度——一个表示这个数选了,一个表示没有选
如果上一个没有选,那么当前的选或者不选都可以,所以我们取大的值
如果上一个选了的的话并且当前想要去选的话,那么我们便得要选择上一个没选过的来加上了;
实践上面无非是:
我们设当没选了的最优的是:f[i][0]
当前选了的最优的是: f[i][1]
那么根据上面的分析便可以得到状态转移方程:
f[i][0] = max{f[i-1][0],f[i-1][1]}
f[i][1] = f[i-1][0]+a[i];
代码:
#include <bits/stdc++.h>
using namespace std;
int n,ans;
int a[1000009],f[1000009][1];
int main()
{
cin>>n;
for (int i = 1; i <= n; i++)
cin>>a[i];
//初始的状态,选的和没选的
f[1][0] = 0;
f[1][1] = a[1];
for (int i = 2; i <= n; i++) //状态转移方程
f[i][0] = max(f[i-1][0],f[i-1][1]),
f[i][1] = f[i-1][0] + a[i];
ans = max(f[n][0],f[n][1]); //取最大的
cout<<ans;
return 0;
}