列表

详情


DP25. 删除相邻数字的最大分数

描述

给定一个长度为 n 的仅包含正整数的数组,另外有一些操作,每次操作你可以选择数组中的任意一个元素 ,同时数组中所有等于 的元素会被全部移除,同时你可以得到 分,直到所有的元素都被选择或者删除。
请你计算最多能得到多少分。
数据范围: 数组长度满足 ,数组中的元素大小都满足

输入描述

第一行输入一个正整数 n 表示数组的长度
第二行输入 n 个数字表示数组的各个元素值。

输出描述

输出能得到的最大分数。

示例1

输入:

2
1 2

输出:

2

说明:

直接选择元素 2 ,然后 1 被同时移除。

示例2

输入:

3
1 2 3

输出:

4

说明:

先选择 3 ,同时 2 被移除,再选择 1 ,即得到 4 分。

示例3

输入:

9
1 2 1 3 2 2 2 2 3

输出:

10

说明:

第一步选择一个 2 ,然后所有 1 和 3 都被移除了,此时数组中剩下的是 [2,2,2,2] ,依次选择他们即可得到 10 分

原站题解

C++ 解法, 执行用时: 14ms, 内存消耗: 484KB, 提交时间: 2022-03-24

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int N = 1e4+10;

int a[N],f[N],n;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int t;
        scanf("%d",&t);
        a[t]+=t;
    }
    
    f[1]=a[1];
    for(int i=2;i<N;i++)
    {
        f[i]=max(f[i-1],f[i-2]+a[i]);
    }
    
    printf("%d\n",f[N-1]);
    return 0;
}

C++ 解法, 执行用时: 14ms, 内存消耗: 996KB, 提交时间: 2022-07-28

// #include<iostream>
// #include<cstring>
// #include<algorithm>
// using namespace std;

// const int N = 1e4+10;

// int a[N],f[N],n;

// int main()
// {
//     scanf("%d",&n);
//     for(int i=1;i<=n;i++)
//     {
//         int t;
//         scanf("%d",&t);
//         a[t]+=t;
//     }
    
//     f[1]=a[1];
//     for(int i=2;i<N;i++)
//     {
//         f[i]=max(f[i-1],f[i-2]+a[i]);
//     }
    
//     printf("%d\n",f[N-1]);
//     return 0;
// }
#include <bits/stdc++.h> // C++万能头文件
using namespace std;
static const auto io_sync_off = [](){ // lambda表达式
    std::ios::sync_with_stdio(false); // 解除与scanf()等函数的同步
    std::cin.tie(nullptr); // 解除cin和cout的绑定
    return nullptr;
}();

/*
按元素值统计每个数出现的个数,总和即为该数得分
依题得分不能来自两个相邻的元素值
按取值遍历,同样用变量表示是否选择当前值即可
*/

int main() {
    int points[10001] = {0}; // 各个取值的得分
    int n;
    cin >> n;
    while (n--) {
        int i;
        cin >> i;
        points[i] += i;
    }
    long yes = 0, no = 0;
    for (int i = 1; i <= 10000; ++i) {
        long pre = no;
        no = max(yes, no); // 不选当前值的最大得分
        yes = pre + points[i]; // 选取当前值的最大得分
    }
    cout << max(yes, no) << "\n";
    return 0;
}

C++ 解法, 执行用时: 15ms, 内存消耗: 496KB, 提交时间: 2022-07-21

#include <bits/stdc++.h> // C++万能头文件
using namespace std;
static const auto io_sync_off = [](){ // lambda表达式
    std::ios::sync_with_stdio(false); // 解除与scanf()等函数的同步
    std::cin.tie(nullptr); // 解除cin和cout的绑定
    return nullptr;
}();

/*
按元素值统计每个数出现的个数,总和即为该数得分
依题得分不能来自两个相邻的元素值
按取值遍历,同样用变量表示是否选择当前值即可
*/

int main() {
    int points[10001] = {0}; // 各个取值的得分
    int n;
    cin >> n;
    while (n--) {
        int i;
        cin >> i;
        points[i] += i;
    }
    long yes = 0, no = 0;
    for (int i = 1; i <= 10000; ++i) {
        long pre = no;
        no = max(yes, no); // 不选当前值的最大得分
        yes = pre + points[i]; // 选取当前值的最大得分
    }
    cout << max(yes, no) << "\n";
    return 0;
}

C++ 解法, 执行用时: 15ms, 内存消耗: 524KB, 提交时间: 2022-07-22

#include <bits/stdc++.h>
using namespace std;

const static int MAX_SIZE = 10001;
int a[MAX_SIZE];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    int n;
    cin >> n;
    int max_val = 0;
    int min_val = 1000000;
    for (int i = 0; i < n; i++) {
        int temp;
        cin >> temp;
        a[temp] += 1;
        max_val = max(max_val, temp);
        min_val = min(min_val, temp);
    }
    
    int v[max_val];
    for (int i = 0; i <= max_val; i++) {
        v[i] = 0;
    }
    v[1] = a[1];
    for (int i = max(1, min_val); i <= max_val; i++) {
        v[i] = max(v[i - 1], v[i - 2] + a[i] * i);
    }
    cout << v[max_val] << endl;
}

C 解法, 执行用时: 16ms, 内存消耗: 396KB, 提交时间: 2022-06-20

#include <stdio.h>

int max(int a, int b) {
    return a > b ? a : b;
}

int main() {
    int n;
    scanf("%d", &n);
    
    int *a = (int *)malloc(sizeof(int) * 10010);
    int *f = (int *)malloc(sizeof(int) * 10010);
    memset(a, 0, sizeof(int) * 10000);
    memset(f, 0, sizeof(int) * 10000);
    for (int i = 0; i < n; i++) {
        int t;
        scanf("%d", &t);
        a[t] += t;
    }

    f[1] = a[1];
    for (int i = 2; i < 10010; i++) {
        f[i] = max(f[i-1], f[i-2] + a[i]);
    }
    
    printf("%d\n", f[10009]);
    
    free(a);
    free(f);
    
    return 0;
}


上一题