地址: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;
}