Divan and Kostomuksha (easy version) dp,gcd(2100)
生活随笔
收集整理的這篇文章主要介紹了
Divan and Kostomuksha (easy version) dp,gcd(2100)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意 :
- 對于給定序列,任意打亂順序,問 :∑i=1ngcd(a1,a2,...,an)\sum_{i=1}^{n}gcd(a_1,a_2,...,a_n)i=1∑n?gcd(a1?,a2?,...,an?)的最大值是多少
思路 :
- 序列的gcd一定是遞減的
- 設(shè)cnt(i)cnt(i)cnt(i)表示以i為因數(shù)(包含i)的數(shù)字的數(shù)量,dp[i]dp[i]dp[i]表示將i放在第一個的答案
- 轉(zhuǎn)移方程為dp[j]=max(dp[j],dp[i]+cnt(j)?(j?i)+dp[i])dp[j] = max(dp[j], dp[i] + cnt(j) * (j - i) + dp[i])dp[j]=max(dp[j],dp[i]+cnt(j)?(j?i)+dp[i])
- 這個方程的意義是,選擇cnt(j)cnt(j)cnt(j)個數(shù)字放在最前面,那么產(chǎn)生的gcd貢獻(xiàn)是cnt(j)?jcnt(j)*jcnt(j)?j
- 那么對于后一段填不了j倍數(shù)的位置,不能產(chǎn)生j的貢獻(xiàn)
- 后一段的貢獻(xiàn)怎么算呢?可以枚舉j的因數(shù)(不包含j)(因為后面的數(shù)如果不是j的因數(shù),同時也不是j的倍數(shù),產(chǎn)生的貢獻(xiàn)為1,這等價于填1,而1也是j的因數(shù) <- 這是一個關(guān)鍵的思路,刪繁就簡)
- 對于j的因數(shù)i(i!=j),因為dp[i]dp[i]dp[i]算的是整個序列的答案,那么后一段也包含進去了,但是前一段會有重復(fù)計算,產(chǎn)生貢獻(xiàn)為i?cnt[j]i*cnt[j]i?cnt[j](gcd為i,一共cnt(j)cnt(j)cnt(j)個數(shù)字),要減去這個貢獻(xiàn)
總結(jié)
以上是生活随笔為你收集整理的Divan and Kostomuksha (easy version) dp,gcd(2100)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王道计算机考研 数据结构 (栈和队列)
- 下一篇: Divan and Kostomuksh