[CF413D]2048
生活随笔
收集整理的這篇文章主要介紹了
[CF413D]2048
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意:
在一個長度為$n(n\le2000)$的數組中填數$2$或$4$,待所有數字全部填好后,按照類似于2048的規則向左合并。給定某些格子上的數,問在當前情況下要使得合并后的最大數超過$2^k$有幾種填法。
思路:
動態規劃。
定義一個狀態為最長不上升后綴的數字和,如$(16,4,8,4,4,2)$對應的狀態為$18$,因為后面這些還是有機會合并的,且合并的過程可以直接用加法代替,如$(16,4,8,4,4,2)$后面再加上一個$2$,對應的狀態變為$18+2=20$。定義目標狀態為$2^k$,超過這個的狀態對其取$\min$。用$f[i][j]$表示前$i$個格子狀態為$j$的方案數,則不難得到如下轉移:
當$x=2$時,$f[i][\min(j+2,2^k)]+=f[i-1][j]$;
當$x=4$且當前最后有多余$2$時,新加進來的數不可能再和前面的合并了,故不將前面的計入狀態,$f[i][4]+=f[i-1][j]$;
當$x=4$且當前最后無多余$2$時,$f[i][\min(j+4,2^k)]+=f[i-1][j]$。
當$x$不確定時,同時進行上述兩種轉移即可。
時間復雜度$O(n\cdot2^k)$。
?
轉載于:https://www.cnblogs.com/skylee03/p/8987373.html
總結
以上是生活随笔為你收集整理的[CF413D]2048的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Openstack虚机实例状态错误手工恢
- 下一篇: Android studio下将项目代码