[CF413D]2048
題目大意:
在一個長度為$n(n\le2000)$的數(shù)組中填數(shù)$2$或$4$,待所有數(shù)字全部填好后,按照類似于2048的規(guī)則向左合并。給定某些格子上的數(shù),問在當前情況下要使得合并后的最大數(shù)超過$2^k$有幾種填法。
思路:
動態(tài)規(guī)劃。
定義一個狀態(tài)為最長不上升后綴的數(shù)字和,如$(16,4,8,4,4,2)$對應的狀態(tài)為$18$,因為后面這些還是有機會合并的,且合并的過程可以直接用加法代替,如$(16,4,8,4,4,2)$后面再加上一個$2$,對應的狀態(tài)變?yōu)?18+2=20$。定義目標狀態(tài)為$2^k$,超過這個的狀態(tài)對其取$\min$。用$f[i][j]$表示前$i$個格子狀態(tài)為$j$的方案數(shù),則不難得到如下轉移:
當$x=2$時,$f[i][\min(j+2,2^k)]+=f[i-1][j]$;
當$x=4$且當前最后有多余$2$時,新加進來的數(shù)不可能再和前面的合并了,故不將前面的計入狀態(tài),$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虚机实例状态错误手工恢
- 下一篇: kafka环境安装及简单使用(单机版)