首页 > 其他分享 >某笔试题的思路

某笔试题的思路

时间:2023-03-18 19:56:53浏览次数:39  
标签:cnt 没选 笔试 选择 全选 num 思路 dp

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

相关文章