zoukankan      html  css  js  c++  java
  • Codeforces #505(div1+div2) D Recovering BST

    题意:给你一个升序的数组,元素之间如果gcd不为1可以建边,让你判断是否可以建成一颗二叉搜索树。

    解法:dp,首先建图,然后进行状态转移。因为如果点k左端与i相连,右端与k相连,则i和k可以相连,同时像左右两端拓展。

    最后判断1和n是否相连即可。

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<vector>
    using namespace std;
    int dp[710][710],l[710][710],r[710][710],G[710][710],a[710];
    inline int gcd(int a,int b){
    	return b?gcd(b,a%b):a;
    }
    int main(){
    	int n;
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++){
    		scanf("%d",&a[i]);
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(gcd(a[i],a[j])>1)G[i][j]=1;
    		}
    	}
    	for(int i=1;i<=n;i++)
    		l[i][i]=r[i][i]=1;
    	for(int i=n;i>=1;i--){
    		for(int j=i;j<=n;j++)
    			for(int k=i;k<=j;k++){
    				if(l[i][k]&&r[k][j]){//如果k左端可以到i,右端可以到j 
    					dp[i][j]|=1;
    					r[i-1][j]|=G[k][i-1];//向左延伸 
    					l[i][j+1]|=G[k][j+1];//向右延申 
    				}
    			}
    	}
    	if(dp[1][n])printf("Yes
    ");
    	else printf("No
    ");	
    }
    

      

  • 相关阅读:
    Layui_2.x_上传插件使用
    Layui_1.0.9_分页实例_Java
    Jquery_如何扩展方法
    Linux_Crontab命令
    Linux_Centos7_设置MySql定时备份
    Linux_MySql_tar_安装(转)
    MySql_创建用户并赋予权限
    滚动条定位
    MySQL 存储过程创建表
    取两个时间差
  • 原文地址:https://www.cnblogs.com/pkgunboat/p/9508265.html
Copyright © 2011-2022 走看看