题意:B点左上全为B, 求剩余可能填充方案 。
当某行B在R之后出现 无答案, l,r 维护出阶梯形,再dp,临界条件一行的情况,之后前面全B 后面R 一种,上下关系的话(我从下到上),i,j对i-1,j之后的无染色影响,可转移。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
char mp[35][35];
int l[35],r[35];
ll dp[35][35];
int flag=0;
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) {
scanf("%s",mp[i]+1);
l[i]=0,r[i]=m;
for(int j=1; j<=m; j++)
{
if(mp[i][j]=='B') l[i]=max(l[i], j );
if(mp[i][j]=='R') r[i]=min(r[i], j - 1);
}
if(r[i]<l[i])flag=1;
}
if(flag) {
printf("0\n");
return 0;
}
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];
}
}
}
ll sum=0;
for(int i=0; i<=m; i++)sum+=dp[1][i];
printf("%lld\n",sum);
return 0;
}