Leetcode 740

news/2024/11/9 10:00:23/

Delete and Earn

跟之前的上楼梯问题有点像,其实就是一个数组nums选中了一个数以后,它的连续的前一个或者后一个都要删掉,求可获得的最大的和。
算法过程分析:在到达一个数时,只能选择留下前一个数,或者留下前前一个数加上现在的值,用totol记录某一个数的最大值,那么转移方程为totol[i] = max(totol[i - 1], totol[i - 2] + nums[i]),因为还有很多重复的值,所以用了一个map来记录有多少重复的,并且map已经是排好序的,这一点很方便。
以下是代码:

class Solution {
public:int deleteAndEarn(vector<int>& nums) {if(nums.empty()) return 0;map<int, int> m;vector<int> totol(10010, 0);int res = 0, last, last1;for (int i = 0; i < nums.size(); i++) {auto it = m.find(nums[i]);if(it == m.end()) m[nums[i]] = 1;else m[nums[i]] = m[nums[i]] + 1;}auto it = m.begin();totol[it -> first] = it -> first * it -> second;res = totol[it -> first];last = last1 = it -> first;int i = 1;for (it++; it != m.end(); it++, i++) {if(last1 + 1 == it -> first) {if(i == 1) {totol[it -> first] = max(it -> first * it -> second, totol[last]);last1 = it -> first;} else {totol[it -> first] = max(totol[last1], totol[last] + it -> first * it -> second);last = last1;last1 = it -> first;}} else {totol[it -> first] = totol[last1] + it -> first * it -> second;last = last1;last1 = it -> first;}if(res < totol[it -> first]) res = totol[it -> first];}
        return res;}
};

这一题写的比较复杂,看到了discuss以后,发现一个非常简单的dp方法,我写的复杂是因为在考虑第一个数和第二个该怎么获取,这里变得很麻烦,discuss的方法是将其存到数组中,从第0个开始,dp[i]表示i可以获取最多的数,这里学到了一个,把数放后一个,而不是从头开始放。
下面是discuss的代码:
“`c++
int deleteAndEarn(vector& nums) {
if(nums.size()==0) return 0;

    std::vector<int> a(10001,0); // frequency of numbers from 1 to 10000for(int i:nums){++a[i];}std::vector<int> dp(a.size()+1,0);dp[1]=a[1]*1;for(int i=2;i<=10000;++i){dp[i]=std::max(dp[i-1],a[i]*i+dp[i-2]);}return dp[10000];
}
```

http://www.ppmy.cn/news/523253.html

相关文章

戴尔服务器r740硬盘指示灯,戴尔R740服务器获取cpu、内存、硬盘参数信息。

戴尔R740服务器获取cpu、内存、硬盘参数信息。使用redfish协议,只使用了system的一个总URL即可获取所有参数。 import requests import json requests.packages.urllib3.disable_warnings() ##使用一个system总的URL分别获取到cpu、内存、存储三个url.所以只修改system的URL即…

戴尔服务器R740cpu型号,戴尔_PowerEdge R740_机架式服务器_服务器 | Dell 中国大陆

英特尔 至强 银牌 4210R 2.4G, 10C/20T, 9.6GT/s, 13.75M 缓存, Turbo, HT (100W) DDR4-2400 英特尔 至强 银牌 4214R 2.4G, 12C/24T, 9.6GT/s, 16.5M 缓存, Turbo, HT (100W) DDR4-2400 英特尔 至强 银牌 4215R 3.2G, 8C/16T, 9.6GT/s, 11 M 缓存, Turbo, HT (130W) DDR4-2400…

安装nvidia驱动Cuda,Cudnn

如果之前装过驱动&#xff0c;此时卡在登陆界面或黑屏可以尝试 卸载之前装的驱动 sudo apt-get remove nvidia-* sudo nvidia-uninstallsudo apt-get autoremove //谨慎使用&#xff0c;可能误删别的文件 最好不用 禁掉nouveau sudo gedit /etc/modprobe.d/blacklist-nouv…

windows7安装TensorFlow-gpu,gtf740M显卡

安装前期准备&#xff1a; 配备740M 显卡的PC机 anconda3 能够访问Google的网络 cudnn-8.0-windows7-x64-v6.0 cuda_8.0.44_windows 百度网盘&#xff0c;密码: ev93 pycharm 安装过程&#xff1a; 首先安装cuda 默认安装就好 接着讲cudnn解压至cuda的对应文件夹&a…

射频功放简略

在无线通信中&#xff0c;信号的最终发射需经过放大才能在空间中进行传播&#xff0c;而能够实现放大功能的模块即是功放&#xff0c;功放的种类根据放大信号形式的不同&#xff0c;分为连续波和脉冲两大类&#xff0c;连续波的功放一般是线性工作&#xff0c;脉冲功放则大多工…

定压功放与定阻功放

定压功放与定阻功放 一、在输出形式上的区别&#xff1a; 定压与定阻是输出形式上不一样&#xff1a; 1、定压不是电压一定&#xff0c;而是输出形式是定压&#xff0c;它要求负载的额定电压一定。定压功放以多个定压音箱并联的形式连接&#xff0c;只要总功率不超过定压功放的…

10wgongfang_217-2_jingtiguandianlushejishangce功放

三极管用到四种。 2SA1306和2SC3298A&#xff1b;配对 2SC3423和2SA1360配对。这里是SA1360,上面的是SA1306&#xff0c;不一样。不要弄错了。 一定要记得看资料&#xff0c;哪个是B&#xff0c;哪个是C&#xff0c;哪个是E&#xff1b; 对于NPN&#xff0c;有箭头的是发射极E…

WAP、WIFI、CMWAP、CMNET上网方式的区别与联系

WAP、WIFI、CMWAP、CMNET上网方式的区别与联系 收藏 在国际上&#xff0c;通常只有一种GPRS接入方式&#xff0c;为什么在中国会有CMWAP和CMNET两兄弟呢&#xff1f;&#xff08;彩信之所以单独配置接入点是因为彩信服务需要连接专用的服务器&#xff09;使用 WIFI 上网的朋友&…