日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[CF413D]2048

發布時間:2025/7/25 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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)$。

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的全部內容,希望文章能夠幫你解決所遇到的問題。

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