1. 程式人生 > >Codeforces Educational Codeforces Round 56 (Rated for Div. 2) 1093F. Vasya and Array

Codeforces Educational Codeforces Round 56 (Rated for Div. 2) 1093F. Vasya and Array

有一個長度為 n n 的的數列, a i a_i 的值域只有 k

k 個元素。
一個數列有一些數字已經填上。現在要求數列連續的數字長度不能超過 l l ,問所有不同的數列的個數有多少個。
1.考慮所有的數字都沒填上。設 d p [
i ] [ j ] [ s ] dp[i][j][s]
為第 i i 個位置填入第 j j 種顏色且已經有連續的 s s 個數字的方案數。顯然:
那麼:
d p [ i ] [ j ] [ s ] = d p [ i 1 ] [ j ] [ s 1 ] [ s l 1 ] ( p = 1 ( t = 1 k d p [ i l + 1 ] [ t ] [ p ] d p [ i l + 1 ] [ j ] [ p ] ) ) , 2 s l 1 , d p [ i ] [ j ] [ s ] = 1 t k , j t p = 1 d p [ i 1 ] [ t ] [ p ] , s = 1 d p [ i ] [ j ] [ s ] = 0 , s l . dp[i][j][s]=dp[i-1][j][s-1] -[s\geqslant l-1](\sum_{p=1}^{\infty}(\sum_{t=1}^k dp[i-l+1][t][p]-dp[i-l+1][j][p])),2\leqslant s \leqslant l-1,\\ dp[i][j][s]=\sum_{1\leqslant t\leqslant k,j\neq t}\sum_{p=1}^{\infty}dp[i-1][t][p],s=1\\ dp[i][j][s]=0,s\geqslant l.
求和得:
p = 1 s d p [ i ] [ j ] [ p ] = p = 1 t = 1 k d p [ i 1 ] [ j ] [ p ] [ s l 1 ] ( p = 1 t = 1 k d p [ i l + 1 ] [ t ] [ p ] p = 1 d p [ i l + 1 ] [ j ] [ p ] ) \sum_{p=1}^{s}dp[i][j][p]=\sum_{p=1}^{\infty}\sum_{t=1}^kdp[i-1][j][p]-[s\geqslant l-1](\sum_{p=1}^{\infty}\sum_{t=1}^k dp[i-l+1][t][p]-\sum_{p=1}^{\infty}dp[i-l+1][j][p])
因為具有規整性,並且考慮到 d p [ i ] [ j ] [ s ] = d p [ i 1 ] [ j ] [ s 1 ] dp[i][j][s]=dp[i-1][j][s-1]
所以令 a v a [ i ] [ j ] = p = 1 d p [ i ] [ j ] [ p ] , s u m [ i ] = i = 1 k a v a [ i ] [ j ] \displaystyle ava[i][j]=\sum_{p=1}^{\infty}dp[i][j][p],sum[i]=\sum_{i=1}^k ava[i][j] ,得:
a v a [ i ] [ j ] = s u m [ i 1 ] [ max a v a l e n j l 1 ] ( s u m [ i l + 1 ] a v a [ i l + 1 ] ) , i = 1 , 2 , , n ava[i][j]=sum[i-1]-[\max avalen_j\geqslant l-1](sum[i-l+1]-ava[i-l+1]),i=1,2,\dots,n
其中 max a v a l e n j \max avalen_j 是指當前可能達到的最大連續後綴長度。
2.考慮有的數字已經填上。顯然這時候,如果 j = a [ i ] j=a[i]