bzoj2958序列染色

2021-08-08 01:16:46 字數 1534 閱讀 6207

暴風城傳送門

這題因為一開始使用了不方便的狀態,所以調了很久。網上大部分題解都是f[i][j][k]為狀態的,但我是只用了f[i][j],所以迷操了很久。

f[i][j][k]的狀態和轉移比較簡單,而且我沒有分析過,所以這裡就不寫了,具體看別人的總結就好。

然後我說一下我的方法。下面b用1表示,w用2表示。

f[i][j]表示填到第i個其中狀態是j(j=0,1,2分別表示三種狀態)的數量。

首先一開始我沒有考慮11111(k=3)中到底是前111是一組還是中間111一組還是後面111是一組。所以一開始就卡了很久。

然後我決定把最後的111定成貢獻,那麼問題就變成a

for (int i=1;i<=n;i++)  else 

if (i+k-1

<=n)

}if (s1[j]-s1[i-1]==0&&a[j+1]!=2)

}}//s1為1的部分和,s2為2的部分和

然後就解決了上面那個問題。

我覺得我寫的很清楚,我覺得我沒必要解釋。

但我一看,發現還是有算重的,例如

(11211)221與112(11221)算重了。

但我驚奇地發現f[i][0]=2^i,真正的f『

[i][

1]=f

[i][

1]−f

[i][

2],f

[i][

0]=f

[i][

0]−f

[i][

1]−f

[i][

2]

#include 

#include

#include

#include

#include

#include

using namespace std;

const int mod=1e9+7,mn=1000010;

char st[mn];

long long a[mn],s1[mn],s2[mn],s3[mn],f[mn][3],n,k;

int main()

f[0][0]=1;

for (int i=1;i<=n;i++)

f[i][0]=f[i][1]=f[i][2]=0;

for (int i=1;i<=n;i++) else

f[i-1][1]=(f[i-1][1]-f[i-1][2]%mod);

f[i-1][0]=((f[i-1][0]-f[i-1][1]%mod)-f[i-1][2])%mod;

if (i+k-1

<=n)

}if (s1[j]-s1[i-1]==0&&a[j+1]!=2) }}

printf("%d",(f[n][2]+mod)%mod);

return

0;}

this is my fate.

bzoj2958 序列染色 DP

題目 傳送門 題解 大難題啊 還是我太菜了 一發大佬qtt 1 include2 include3 include4 include5 include6 define mod 1000000007 7using namespace std 8 typedef long long ll 9 intn,...

BZOJ4403 序列統計

description 給定三個正整數n l和r,統計長度在1到n之間,元素大小都在l到r之間的單調不降序列的數量。輸出答案對10 6 3取模的結果。input 輸入第一行包含乙個整數t,表示資料組數。第2到第t 1行每行包含三個整數n l和r,n l和r的意義如題所述。output 輸出包含t行,...

BZOJ4403 序列統計

推導式子 baidu可得 設m r l 1 長度為i,元素大小在1 m之間的單調不降序列的數量有cm 1i m 1個 故答案為 n i 1 cm 1 i m 1 ni 1 cm 1i m 1 cm m 1 ni 2 cm 1i m 1 cm m 1 1 ni 3 cm 1i m 1 cm m 2 1...