当前位置: 首页 > news >正文

「CF1025D Recovering BST」

题目

郑州讲过的题了

发现这是一个二叉搜索树,给出的还是中序遍历,我们很自然的想到我们需要可以用一个\(f[i][j][k](k\in[i,j])\)来表示区间\([i,j]\)能不能形成以\(k\)为根的二叉搜索树

就是区间的\(dp\)的套路我们还需要枚举一下树根,复杂度高达\(O(n^5)\)

很不可行啊

换一个思路,我们用\(f[i][j][0/1]\)表示区间\([i,j]\)能否形成一棵左子树/右子树

如果形成的是左子树,自然树根是\(j+1\),如果是右子树,根自然是\(i-1\)

于是我们枚举区间\([i,j]\),枚举和\([i,j]\)形成一棵树的另一个区间,由于这个区间已经确定了左端点或者右端点,我们\(O(n^3)\)就能完成枚举

之后如果能拼接成一棵新树,树根自然也就知道了,转移过去就好了

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define LL long long 
#define re register
#define maxn 705
inline int read() {
    char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int gcd(int a,int b) {if(!b) return a;return gcd(b,a%b);}
int n,a[maxn];
int e[maxn][maxn];
int f[maxn][maxn][2];
int main() {
    n=read();
    for(re int i=1;i<=n;i++) a[i]=read();
    for(re int i=1;i<=n;i++)
        for(re int j=i+1;j<=n;j++)
            e[i][j]=e[j][i]=(gcd(a[i],a[j])!=1);
    for(re int i=1;i<=n;i++) {
        if(i>1&&e[i-1][i]) f[i][i][1]=1;
        if(i<n&&e[i][i+1]) f[i][i][0]=1; 
    }
    for(re int p=1;p<n;p++) {
        for(re int i=1;i<=n;i++) {
            int j=i+p-1;
            if(f[i][j][1]) {
                for(re int k=1;k<=i-2;k++)
                if(f[k][i-2][0]) {
                    if(e[k-1][i-1]) f[k][j][1]=1;
                    if(e[j+1][i-1]) f[k][j][0]=1;
                }
                if(e[i-2][i-1]) f[i-1][j][1]=1;
                if(e[i-1][j+1]) f[i-1][j][0]=1;
            }
            if(f[i][j][0]) {
                for(re int k=j+2;k<=n;k++)
                if(f[j+2][k][1]) {
                    if(e[j+1][k+1]) f[i][k][0]=1;
                    if(e[j+1][i-1]) f[i][k][1]=1;
                }
                if(e[j+1][j+2]) f[i][j+1][0]=1;
                if(e[j+1][i-1]) f[i][j+1][1]=1;
            }
        }
    }
    f[1][0][0]=1;
    int flag=0;
    for(re int i=2;i<=n;i++)
        if(f[i][n][1]&&f[1][i-2][0]) flag=1;
    flag|=f[1][n-1][0];
    puts(flag?"Yes":"No");
    return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/10505413.html

相关文章:

  • Python 装饰器
  • 研发管理工具Leangoo泳道实现Scrum任务看板
  • Codeforces Round 545 (Div. 2)
  • JQuery EasyUI 初始
  • 特殊字符
  • Ionic3关闭弹出页面,跳转到列表后刷新父页面
  • 【计算几何】二维凸包——Graham's Scan法
  • ArrayList中的一些小细节@JDK8
  • MySQL 连接 通过实例总结详解 笛卡尔积,自然连接,内连接,外连接
  • 前端的第一步
  • P3375 【模板】KMP字符串匹配
  • C++11并发——多线程std::thread (一)
  • unity下贴图混合(Texture Blending)
  • elasticsearch中ik词库配置远程热加载
  • OL4加载geowebcache 部署的离线切片
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • CentOS6 编译安装 redis-3.2.3
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Javascript设计模式学习之Observer(观察者)模式
  • Java多态
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • node-glob通配符
  • PHP那些事儿
  • ReactNative开发常用的三方模块
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • WebSocket使用
  • 对超线程几个不同角度的解释
  • 异常机制详解
  • - 转 Ext2.0 form使用实例
  • #etcd#安装时出错
  • #pragma data_seg 共享数据区(转)
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (LeetCode 49)Anagrams
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 表达式计算:Expression Evaluator
  • .net 中viewstate的原理和使用
  • .NET导入Excel数据
  • .net对接阿里云CSB服务
  • @angular/cli项目构建--Dynamic.Form
  • [ SNOI 2013 ] Quare
  • [android] 看博客学习hashCode()和equals()
  • [Android]使用Git将项目提交到GitHub
  • [APIO2015]巴厘岛的雕塑
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法