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;
}