[CQOI2017] 老C的键盘(树形dp + 组合数)
problem
luogu-P3757
solution
observation:\text{observation}:observation: hi/2?hih_{i/2}-h_ihi/2??hi? 的大小關系,其實就是個二叉樹的大小關系。
這很類似之前的排列 dpdpdp ,遷移過來,我們嘗試 f(i,j):if(i,j):if(i,j):i 在子樹內第 jjj 小的方案數。
當所有符號都是一個方向的時候,就是 [ZJOI2010]排列計數的題解,所以我們類比這里應該也是有組合數計算轉移的。
同樣是編號劃分離散化的理解。
假設當前點為 uuu,兒子為 vvv,枚舉 uuu 為其所在連通塊的第 iii 小,vvv 為其所在聯通塊的第 jjj 小:
-
hu<hvh_u<h_vhu?<hv?。
考慮合并后,uuu 可能在新大小為 sizu+sizvsiz_u+siz_vsizu?+sizv? 的連通塊中的排名。
這就要看 vvv 所在聯通塊前 jjj 小的數與 huh_uhu? 的關系了。
但一定不會到 i+ji+ji+j。
所以,枚舉合并后 uuu 的排名為 kkk,i≤k<i+ji\le k<i+ji≤k<i+j。
f(u,k)←f(u,i)?f(v,j)?(k?1i?1)?(sizu+sizv?ksizu?i)f(u,k)\leftarrow f(u,i)*f(v,j)*\binom{k-1}{i-1}*\binom{siz_u+siz_v-k}{siz_u-i}f(u,k)←f(u,i)?f(v,j)?(i?1k?1?)?(sizu??isizu?+sizv??k?)
-
hu>hvh_u>h_vhu?>hv?。
轉移方程式和原理同上一種情況,只是 kkk 的范圍有所變化,i+j≤k≤i+sizvi+j\le k\le i+siz_vi+j≤k≤i+sizv?。
時間復雜度為 O(n3)O(n^3)O(n3)。
前綴和優化 O(n2)O(n^2)O(n2) 可以看[HEOI2013]SAO的題解。
code
#include <bits/stdc++.h> using namespace std; #define int long long #define mod 1000000007 #define maxn 105 char s[maxn]; int n; int c[maxn][maxn], f[maxn][maxn], g[maxn], siz[maxn];void dfs( int u ) {f[u][1] = siz[u] = 1;for( int o = 0;o <= 1;o ++ ) {int v = (u << 1) + o;if( v > n ) break;dfs( v );memcpy( g, f[u], sizeof( f[u] ) );memset( f[u], 0, sizeof( f[u] ) );for( int i = 1;i <= siz[u];i ++ )for( int j = 1;j <= siz[v];j ++ )if( s[v] == '>' ) {for( int k = i + j;k <= i + siz[v];k ++ )(f[u][k] += g[i] * c[k - 1][i - 1] % mod * f[v][j] % mod * c[siz[u] + siz[v] - k][siz[u] - i]) %= mod;}else {for( int k = i;k < i + j;k ++ )(f[u][k] += g[i] * c[k - 1][i - 1] % mod * f[v][j] % mod * c[siz[u] + siz[v] - k][siz[u] - i]) %= mod;}siz[u] += siz[v];} }signed main() {scanf( "%lld %s", &n, s + 2 );for( int i = 0;i <= n;i ++ ) {c[i][0] = c[i][i] = 1;for( int j = 1;j < i;j ++ )c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;}dfs( 1 );int ans = 0;for( int i = 1;i <= n;i ++ ) (ans += f[1][i]) %= mod;printf( "%lld\n", ans );return 0; }總結
以上是生活随笔為你收集整理的[CQOI2017] 老C的键盘(树形dp + 组合数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软能让你的显卡电脑显示的显卡为微软基本
- 下一篇: [HEOI2013] SAO(dp +