【蓝桥杯国赛真题dfs】机器人塔

解答思路: 
我们可以发现只需要确定最底层的情况,就可以依次向上推出每一层的情况,因此解决方法是:先用dfs列举出最底层的情况,然后向上递推判断这种情况是否满足,满足则答案加1。向上递推可以使用dp进行优化,从而加快速度。

知识点: 
dfs搜索、递推、dp(动态规划)

C++代码:

#include <iostream>
using namespace std;

int M, N, H;
int ans = 0;
char ch[500][500];

//用于进行dp优化 
int flag[500][500][500] = {0};
bool dp[500][500][500];

//判断m个A,n歌B是否能组成高度为H的三角的第h层 
int search(int m, int n, int h){
    if(flag[m][n][h] != 0){
        return dp[m][n][h];
    }

    if(h == H){
        flag[m][n][h] = 1;
        return dp[m][n][h] = true;
    }

    for(int i = 0; i < H - h; ++ i){
        if(ch[h - 1][i] == ch[h - 1][i + 1]){
            if(m <= 0){
                flag[m][n][h] = 1;
                return dp[m][n][h] = false;
            }
            ch[h][i] = 'A';
            -- m;
        }
        else{
            if(n <= 0){
                return dp[m][n][h] = false;
            }
            ch[h][i] = 'B';
            -- n;
        }
    }

    flag[m][n][h] = 1;
    return dp[m][n][h] = search(m, n, h + 1);
}

//对最底层的情况进行列举 
void dfs(int m, int n, int i){
    if(i == H){
        if(search(m, n, 1)){
            ++ ans;
            //输出三角
            /*for(int i = 0; i < H; ++ i){
                for(int j = 0; j < H; ++ j){
                    cout << ch[i][j] << " ";
                }
                cout << endl;
            }
            cout << endl;*/
        }
        return;
    }

    if(m){
        ch[0][i] = 'A';
        dfs(m - 1, n, i + 1);
    }
    if(n){
        ch[0][i] = 'B';
        dfs(m, n - 1, i + 1);
    }
}

int main(){
    cin >> M >> N;
    for(H = 0; H*(H + 1) != 2*(M + N); ++ H);
    dfs(M, N, 0);
    cout << ans << endl; 
    return 0;
}


我觉得思路真的仔细想会想出来的(首先!是要理解题意!比如此题,其实就是最底层定了之后就等于定好了整体的布局)

至于dp优化什么的,可以先暴力一下把样例过了,再想想能不能优化(稳拿的分先拿到呀!!!)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值