蓝色左上只能是蓝色,红色右下只能是红色。
其实只要考虑一种就可以了,因为考虑了一种颜色 ,另一种就会和他叠起来。‘
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
char s[40][40];
ll dp[40][40];
int a[40][40];
int n, m;
int check(int x, int y)
{
for(int i = 1; i <= y; i++)
if(s[x][i] == 'R')
return 0;
for(int i = y + 1; i <= m; i++)
if(s[x][i] == 'B')
return 0;
return 1;
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
for(int i = 1; i <= n; i++)
scanf("%s", s[i] + 1);
memset(dp, 0, sizeof(dp));
memset(a, 0, sizeof(a));
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= m; j++)
a[i][j] = check(i, j);
}
for(int i = 0; i <= m; i++) dp[1][i] = a[1][i];
for(int i = 2; i <= n; i++)
{
for(int j =0; j <= m; j++)
for(int k = 0; k <= j; k++)
dp[i][k] += dp[i - 1][j] * a[i][k];
}
ll ans = 0;
for(int i = 0; i <= m; i++) ans += dp[n][i];
printf("%lld\n", ans);
}
return 0;
}