日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

[CF413D]2048

發(fā)布時間:2025/7/25 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [CF413D]2048 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目大意:
  在一個長度為$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)$。

1 #include<cstdio> 2 #include<cctype> 3 #include<algorithm> 4 inline int getint() { 5 register char ch; 6 while(!isdigit(ch=getchar())); 7 register int x=ch^'0'; 8 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 9 return x; 10 } 11 const int K=10,mod=1e9+7; 12 int f[2][(1<<K)+1]; 13 int main() { 14 const int n=getint(),k=getint()-1; 15 for(register int i=f[0][0]=1;i<=n;i++) { 16 const int x=getint(); 17 std::fill(&f[i&1][0],&f[i&1][1<<k]+1,0); 18 for(register int j=0;j<=1<<k;j++) { 19 if(x!=2) (f[i&1][j&1?2:std::min(j+2,1<<k)]+=f[(i&1)^1][j])%=mod; 20 if(x!=4) (f[i&1][std::min(j+1,1<<k)]+=f[(i&1)^1][j])%=mod; 21 } 22 } 23 printf("%d\n",f[n&1][1<<k]); 24 return 0; 25 }

?

轉載于:https://www.cnblogs.com/skylee03/p/8987373.html

總結

以上是生活随笔為你收集整理的[CF413D]2048的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。