1. 程式人生 > 其它 >上海理工大學第二屆“聯想杯”全國程式設計邀請賽題解

上海理工大學第二屆“聯想杯”全國程式設計邀請賽題解

比賽連結

暫時只做了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); }