Jeanny
寂兮,寥兮,独立不改,周行而不殆

#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;
}
posted on 2025-05-04 16:46  Jeanny  阅读(12)  评论(0)    收藏  举报