bzoj2958&3269: 序列染色(Dp)
題目傳送門
玄學真的不會。
解法:
f[i][j][k]表示第i位,k=0填B,k=1填W。
j=0表示一段長為K連續的B都沒有。
j=1表示有一段長為K連續的B。
j=2表示有一段長為K連續的W。
因為要先有B是連續的才要W連續。
那麼j=2肯定從j=1轉移
保證連續的B後面一定有一個W,連續的W後有一個B,答案就是f[n+1][2][0]
假設這一位選B顯然有
f[i][j][0]=f[i-1][j][1]+f[i-1][j][0]
if(i-k+1到i沒有W)f[i][1][0]=f[i][1][0]+f[i-k][0][1];
然而這樣會有重複,由於f[i][0][0]是亂轉移,中間有可能已經有B了,所以:
if(i-k+1到i沒有W)f[i][0][0]=f[i][0][0]-f[i-k][0][1];
程式碼實現:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
int b[1110000],w[1110000],f[1110000][3][2];char ss[1110000];
const int mod=1000000007;
int main() {
int n,k;scanf("%d%d%s",&n,&k,ss+1);
ss[++n]='X';memset(b,0,sizeof(b));memset(w,0,sizeof(b));
for(int i=1;i<=n;i++) {
b[i]=b[i-1];if(ss[i]=='B')b[i]++;
w[i]=w[i-1];if(ss[i]=='W')w[i]++;
}
memset(f,0,sizeof(f));f[0][0][1]=1;
for(int i=1;i<=n;i++) {
if(ss[i]!='W')for(int j=0;j<3;j++)f[i][j][0]=(f[i-1][j][0]+f[i-1][j][1])%mod;
if(ss[i]!='B')for(int j=0;j<3;j++)f[i][j][1]=(f[i-1][j][0]+f[i-1][j][1])%mod;
if(i<k)continue;
if(ss[i]!='W'&&w[i]==w[i-k]) {
f[i][1][0]=(f[i][1][0]+f[i-k][0][1])%mod;
f[i][0][0]=(f[i][0][0]-f[i-k][0][1])%mod;
}if(ss[i]!='B'&&b[i]==b[i-k]) {
f[i][2][1]=(f[i][2][1]+f[i-k][1][0])%mod;
f[i][1][1]=(f[i][1][1]-f[i-k][1][0])%mod;
}
}printf("%d\n",((f[n][2][0])%mod+mod)%mod);
return 0;
}
相關文章
- 樹上染色(樹形dp)
- 序列 DP
- [樹形dp][HAOI2015]樹上染色
- 序列(dp+矩陣加速)矩陣
- 線性dp:最長上升子序列
- 線性dp:最長公共子序列
- E73 樹形DP P3177 [HAOI2015] 樹上染色
- Luogu P3177 樹上染色 [ 藍 ] [ 樹形 dp ] [ 貢獻思維 ]
- bzoj3675: [Apio2014]序列分割(Dp)API
- 線性dp--最長上升子序列變形
- 線性dp:LeetCode516 .最長迴文子序列LeetCode
- 求迴文子序列個數(雖然字串,但是DP)字串
- [線性dp] 合唱隊形(最長上升子序列模型)模型
- Luogu P11233 CSP-S2024 染色 題解 [ 藍 ] [ 線性 dp ] [ 字首和最佳化 ]
- 線性dp:LeetCode674. 最長連續遞增序列LeetCode
- dp 套 dp(dp of dp)小記
- DP套DP
- [CSP-S 2024] 染色
- [DP] 數位DP
- 【DP】Educational DP Contest
- dp套dp 隨寫
- csp2024T3染色
- lintcode-514-柵欄染色
- 【題解】Solution Set - NOIP2024集訓Day20 DP常⻅模型1「序列」模型
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治優化DP優化
- DP筆記最長上升子序列(LIS)以及零件分組問題筆記
- 以最長公共子序列問題理解動態規劃演算法(DP)動態規劃演算法
- 【DP】區間DP入門
- acm-(區間dp、迴文串、子序列)ICPC SG Preliminary Contest 2018 C - Making PalindromesACM
- dp
- Python視覺化-地圖染色Python視覺化地圖
- [DP] DP最佳化總結
- Luogu P3059 Concurrently Balanced Strings G 題解 [ 紫 ] [ 線性 dp ] [ 雜湊 ] [ 括號序列 ]
- loj#6074. 「2017 山東一輪集訓 Day6」子序列(矩陣乘法 dp)矩陣
- 得物染色環境落地實踐
- 修改 bam 檔案中染色體名
- dp板子
- DP(一)