Codeforces Round #505 D - Recovering BST

地址:http://codeforces.com/contest/1025/problem/D

听说是dp,但是爆搜也可以过,但是空间容易爆,用bool存储搜索的状态,会爆空间,所以用bitset,二进制位存储

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 150005;

#define fi first
#define se second

int gcd(int a,int b)
{
    return (b == 0) ? a : gcd(b,a % b);
}

bool mp[705][705];
bitset<701> vis[705][705],ans[705][705];
int a[705];

bool dfs(int l,int r,int root)
{
    if(l > r) return true;
    if(l == r) return mp[l][root];
    if(vis[l][r][root])
        return ans[l][r][root];
    for(int i = l;i <= r;++i)
    {
        if(mp[root][i] && dfs(l,i - 1,i) && dfs(i + 1,r,i))
        {
            vis[l][r][root] = true;
            ans[l][r][root] = true;
            return true;
        }
    }
    vis[l][r][root] = true;
    return false;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 1;i <= n;++i)
    {
        scanf("%d",&a[i]);
    }
    memset(vis,false,sizeof(vis));
    memset(ans,false,sizeof(ans));
    for(int i = 1;i <= n;++i)
    {
        for(int j = i + 1;j <= n;++j)
        {
            if(gcd(a[i],a[j]) > 1){
                mp[i][j] = true;
                mp[j][i] = true;
            }
            else{
                mp[i][j] = false;
                mp[j][i] = false;
            }
        }
        mp[i][0] = true;
        mp[0][i] = true;
    }
    if(dfs(1,n,0)){
        printf("Yes\n");
    }
    else{
        printf("No\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36386435/article/details/82227178