NC300. 删除相邻数字的最大分数
描述
给定一个长度为 n 的仅包含正整数的数组,另外有一些操作,每次操作你可以选择数组中的任意一个元素 ,同时数组中所有等于 和 的元素会被全部移除,同时你可以得到 分,直到所有的元素都被选择或者删除。示例1
输入:
[1,2]
输出:
2
说明:
直接选择元素 2 ,然后 1 被同时移除。示例2
输入:
[1,2,3]
输出:
4
说明:
先选择 3 ,同时 2 被移除,再选择 1 ,即得到 4 分。示例3
输入:
[1,2,1,3,2,2,2,2,3]
输出:
10
说明:
第一步选择一个 2 ,然后所有 1 和 3 都被移除了,此时数组中剩下的是 [2,2,2,2] ,依次选择他们即可得到 10 分C++ 解法, 执行用时: 21ms, 内存消耗: 3260KB, 提交时间: 2022-03-27
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @return int整型 */ int boredom(vector<int>& a) { // write code here int hash[10005] = {0}; int dp[10005] = {0}; //hash表 //先记录每个元素出现的次数 for(int i = 0; i < a.size(); i++) hash[a[i]]++; //然后就是动态规划问题 dp[1] = hash[1] * 1; for(int i = 2; i <= 10000; i++){ //不选当前元素 和考虑选当前元素 dp[i] = max(dp[i - 1], i * hash[i] + dp[i - 2]); } return dp[10000]; } };
C++ 解法, 执行用时: 21ms, 内存消耗: 3264KB, 提交时间: 2022-04-21
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @return int整型 */ int boredom(vector<int>& a) { // write code here const int n = *max_element(a.begin(), a.end()) + 1; vector<int> dp(n); for (int i=0; i<a.size(); ++i) { dp[a[i]] += a[i]; } for (int i=2; i<n; ++i) { dp[i] = max(dp[i-1], dp[i] + dp[i-2]); } return dp[n-1]; } };
C++ 解法, 执行用时: 22ms, 内存消耗: 3284KB, 提交时间: 2022-06-14
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @return int整型 */ int boredom(vector<int>& a) { // write code here const int n = *max_element(a.begin(), a.end()) + 1; vector<int> dp(n); for (int i=0; i<a.size(); ++i) { dp[a[i]] += a[i]; } for (int i=2; i<n; ++i) { dp[i] = max(dp[i-1], dp[i] + dp[i-2]); } return dp[n-1]; } };
C 解法, 执行用时: 23ms, 内存消耗: 3016KB, 提交时间: 2022-06-25
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型一维数组 * @param aLen int a数组长度 * @return int整型 * * C语言声明定义全局变量请加上static,防止重复定义 */ int max(int a, int b) { return a > b ? a : b; } int boredom(int* a, int aLen ) { int score[10001] = { 0 }; for (int i = 0; i < aLen; i++) { score[a[i]] += a[i]; } int dp[10001] = { 0 }; dp[1] = score[1]; for (int i = 2; i < 10001; i++) { dp[i] = max(score[i] + dp[i-2], dp[i-1]); } return dp[10000]; }
C 解法, 执行用时: 23ms, 内存消耗: 3140KB, 提交时间: 2022-06-15
#include<math.h> int max(int i, int j) { return i > j ? i : j; } int boredom(int* a, int aLen ) { int m[10005] = {0}; int n[10005] = {0}; for (int i = 0; i < aLen; i++) m[*(a + i)]++; n[1] = m[1] * 1; for (int i = 2; i <= 10000; i++) { n[i] = max(n[i - 1], i * m[i] + n[i - 2]); } return n[10000]; }