网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Alex is a perfectionist, so he decided to get as many points as possible. Help him.
Input
The first line contains integer n (1 ≤ n ≤ 105) that shows how many numbers are in Alex’s sequence.
The second line contains n integers a1, a2, …, a**n (1 ≤ a**i ≤ 105).
Output
Print a single integer — the maximum number of points that Alex can earn.
Sample test(s)
input
2
1 2
output
2
input
3
1 2 3
output
4
input
9
1 2 1 3 2 2 2 2 3
output
10
Note
Consider the third test example. At first step we need to choose any element equal to 2. After that step our sequence looks like this [2, 2, 2, 2]. Then we do 4 steps, on each step we choose any element equals to 2. In total we earn 10 points.
题目大意:每次可以取一个数k可以获得k积分,同时去掉所有的k-1,和k+1,问数被取完后的最大积分;
真的,做dp一类的题,知道了怎么构造状态方程,就是很水的题目了,问题就在自己能不能把想到的思路转换成方程
还是看了网上的代码,写出来的状态方程
思路:
将每个数的个数存放在一个数组a里面,那么消除这个数i得到的积分为:a[i]*i(i个数,可以被消灭i次);
构造状态转移方程:dp[i]=max(dp[i-1],dp[i-2]+a[i]*i);
因为当你取i数的时候两种可能:第一,i-1数被取过了,那么这时候i数在取i-1的时候被消灭了,所以dp[i]=dp[i-1];
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新