#2174 取数4
1.暴力dp[i][j]
2.根据数据范围显然要考虑题目中的性质。考虑前n个数要选n/2个数,如果当前这个数取,则前n-2个数必须取n/2个数
O O O O O | O O
O O O O | O O
因此可以设计dp的意义是前i个数选择i/2个的最大之和。
3.分析发现奇偶是不一样的
i为奇数,dp[i] =
取当前的数: dp[i-2] + a[i]
不取当前的数: dp[i-1]
i为偶数,dp[i] =
取当前的数: dp[i-2] + a[i]
不取当前的数 : s[i-1] // 求一个前缀和,固定的规律选择1,3,5...
因此dp方程式为:
if(i%2 ==1 ) dp[i] = max(dp[i-2] + a[i], dp[i-1]);
else dp[i] = max(dp[i-2]+a[i], s[i-1]);
查看代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 300005;
int n, x, y, z, a[maxn];
long long f[maxn], sum[maxn];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (i == 1) {
sum[1] = a[1];
} else if (i % 2 == 1) {
sum[i] = sum[i - 2] + a[i];
}
}
f[1] = 0;
for (int i = 2; i <= n; i++) {
if (i % 2 == 0) {
f[i] = max(f[i - 2] + a[i], sum[i - 1]);
} else {
f[i] = max(f[i - 2] + a[i], f[i - 1]);
}
}
cout << f[n];
return 0;
}
浙公网安备 33010602011771号