上海理工大學第二屆“聯想杯”全國程式設計邀請賽題解
阿新 • • 發佈:2021-06-13
暫時只做了B題,所以只放一下B的題解
Bheith i ngra le
題意:
有一個m*n的網格,網格要麼是黑色要麼是白色。
1、所有的黑色網格連通
2、如果某一列有黑色網格,那麼黑色必須是從最下面開始堆積
hi代表第i列的黑色網格個數
要求:
存在l,r使得
1、1≤l≤r≤n
2、hi在區間[1,l]非遞減
3、hi在區間[r,n]非遞增
4、hi在區間[l,r]相等
問共有多少種染色方法
題解:
動態規劃呀!
都只考慮前面的非遞減區域
dp[i][j]代表當第i列的hi為j時,前i-1列的可能塗色個數
sum[i][j]代表前i行最大的hi為j時的可能塗色個數
我想的是對於x這個位置,列舉它的高度hx,那麼前面區間[1,x-1]的最高h小於hx的可能塗色個數即sum[x-1][hx-1],然後後面區間[x+1,n]的最高h小於等於hx的可能塗色個數即sum[n-x][hx],答案即sum[x-1][hx-1]*sum[n-x][hx]
int n,m,tmp[maxn]; int dp[maxn][maxn],sum[maxn][maxn]; int ans; void solve() { sdd(n,m); tmp[0]=ans=1; rep(i,0,n)sum[i][0]=1; rep(i,0,m)sum[0][i]=1; rep(i,1,n) { rep(j,1,m)tmp[j]=(tmp[j-1]+dp[i-1][j])%mod; rep(j,1,m) { dp[i][j]=tmp[j]; sum[i][j]=(sum[i][j-1]+tmp[j])%mod; } } rep(i,1,n)rep(j,1,m)ans=(ans+1ll*sum[i-1][j-1]*sum[n-i][j]%mod)%mod; pd(ans); }