J:Grid Coloring(dp)

 

 

 

 

 

 题意:给定一个n*m的网格,每个格子可能被涂了蓝色或者红色,也有可能空白,规定蓝色的左上部分全部都只能为蓝,问有多少种涂法。

思路:dp,dp[i][j]表示第i行的前j个全部为Blue的方案数,l[i]表示第i行能把前一部分涂蓝的左边界,r[i]为右边界,从下层往上层递归,dp[i][j]+=dp[i+1][k];

代码:

#include<bits/stdc++.h>
using namespace std;
char g[35][35];
int l[33],r[33];
long long dp[33][33];
int n,m;
long long ans;
int main()
{
    scanf("%d%d",&n,&m);
    int f=1;
    for(int i=1;i<=n;i++)
    {
        cin>>g[i]+1;
        l[i]=0;r[i]=m;
        for(int j=1;j<=m;j++)
        {
            if(g[i][j]=='B')l[i]=max(l[i],j);
            if(g[i][j]=='R')r[i]=min(r[i],j-1);
        }
        if(l[i]>r[i])f=0;
    }
    if(!f)printf("0\n");
    else
    {
        for(int i=l[n];i<=r[n];i++)dp[n][i]=1;
        for(int i=n-1;i>=1;i--)
        {
            for(int j=l[i];j<=r[i];j++)
            {
                for(int k=l[i+1];k<=r[i+1]&&k<=j;k++)
                dp[i][j]+=dp[i+1][k];
            }
        }
        for(int i=l[1];i<=r[1];i++)ans+=dp[1][i];
        printf("%lld\n",ans);
    }
    return 0; 
}

 

posted @ 2020-09-12 20:44  chuliyou  阅读(116)  评论(0编辑  收藏  举报