暴風城傳送門
這題因為一開始使用了不方便的狀態,所以調了很久。網上大部分題解都是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...