num: 2 3 5 7 8 9 //每一个出现的数,从小到大排序好
cnt: 2 1 1 2 3 1 //每个出现的数的数量,比如3表示8出现3次
dp表达方式:dp[n][2]
dp[i][0]:表示在区间1~i上,不选num[i]的最大分数划分方案
dp[i][1]:表示在区间1~i上,选择num[i]的最大分数划分方案
对于第i个数num[i],有两种情况:
1. 没选num[i],因为最后集合为空,潜台词是num[i]一定被前面选择了,
所以其从dp[i-1][1]转移过来
2. 选择num[i], 这样说明就不能选num[i-1], 因为但凡先选了一个num[i-1], num[i]就被
消灭了,先选了num[i], num[i-1]也被消灭选不了。所以其是从dp[i-1][0]转移过来
然后我们这里需要注意一件事,选择num[i]的话是选择几个,1、2、3?因为我们考虑
到在本假设下是一定“选择”num[i]的,所以至少选了1个,选了一个之后,num[i]和
num[i+1]就不存在了,所以剩下的 cnt[i]-1 个num[i]一定被剩余不会被其他数清除,
于是为了清空集合,后续一定再选择num[i],并且再次选择对num[i-1]和num[i+1]无
影响,因为第一次选num[i]就被清理光这两个了。所以其实我们可以得到一个推论,
在“选择”过程中,对于某一个数x,要么不选,要么全选
考虑其中的转移代价,最终动态转移方程:
没选num[i]: dp[i][0] = dp[i-1][1] //注意没选num[i]无分数,num[i-1]的
//分数在dp[i-1][1]中已经计算过
选择num[i],并且全选: dp[i][1] = dp[i-1][0] + num[i]*cnt[i]
//注意根据前面的推论,要选就全选
复杂度:预处理(排序、去重、num、cnt等操作,O(nlog(n))可实现))
dp: O(n) 总复杂度:O(nlog(n))
标签:cnt,没选,笔试,选择,全选,num,思路,dp
From: https://www.cnblogs.com/chaosliang/p/17231592.html