Gym - 101652W

蓝色左上只能是蓝色,红色右下只能是红色。
其实只要考虑一种就可以了,因为考虑了一种颜色 ,另一种就会和他叠起来。‘

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

}

发布了40 篇原创文章 · 获赞 13 · 访问量 859

猜你喜欢

转载自blog.csdn.net/weixin_43891021/article/details/100606623
今日推荐