思路:
这道题是区间dp,l[i][j]=1表示存在一棵树,其根节点是j,没有右子树,r[i][j]表示存在一棵树,其根节点是i,没有左子树。若k为[le][ri]的根,且满足上述两个条件则可以转移。之后通过三层循环进行判断是否满足题目要求,根据题意输出最终结果。
代码:
#include<iostream>
#include<cstring>
using namespace std;
int l[750][750],r[750][750],f[750][750];
int n;
int a[750];
int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
}
void fi()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
l[i][i]=r[i][i]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j&&gcd(a[i],a[j])>1)
f[i][j]=f[j][i]=1;
}
}
for(int le=n;le>=1;le--)
{
for(int ri=le;ri<=n;ri++)
{
for(int k=le;k<=ri;k++)
{
if(l[le][k]&&r[k][ri])
{
if(le==1&&ri==n)
{
cout<<"Yes"<<endl;
return;
//break;
}
if(f[le-1][k])
r[le-1][ri]=1;
if(f[k][ri+1])
l[le][ri+1]=1;
}
}
}
}
cout<<"No"<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
memset(f,0,sizeof(f));
fi();
}
return 0;
}