首先膜一发网上的题解。大佬们tql。

给你n个单调递增的数字,问是否能够把这些数字重新构成一棵二叉搜索树(BST),且所有的父亲结点和叶子结点之间的gcd > 1?

这个题场上是想暴力试试的。结果不行。发现符合最优子结构,可以DP。但是想不出来怎么转移。

看了大佬的题解。

若以第 k 个结点为根节点,用 L[i][k] 表示是否能够向左延伸到 i 点,R[k][j] 表示是否能够向右延伸到 j 点。

那么区间 [l, r] 合法,仅当 L[l][k] && R[k][r] == 1。

这样有了断点 k 作为[l, r]的根,就可以判断gcd能否用L[l][r] 和 R[l][r] 更新 R[l-1][r] 和 L[l][r+1]。

判断gcd可以预处理。

这样总复杂度是n^2 * logn

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
typedef long long LL;
const int maxn = + ; int n;
int a[maxn];
int v[maxn][maxn], L[maxn][maxn], R[maxn][maxn], C[maxn][maxn];
int dp[maxn][maxn][]; int main()
{
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
L[i][i] = R[i][i] = ;
scanf("%d", &a[i]);
} for (int i = ; i <= n; i++)
for (int j = i+; j <= n; j++)
v[i][j] = v[j][i] = __gcd(a[i], a[j]) != ; int r;
for (int len = ; len <= n; len++)
for (int l = ; (r = l+len-) <= n; l++)
for (int k = l; k <= r; k++)
if (L[l][k] && R[k][r])
{
C[l][r] = ;
if (v[k][l-]) R[l-][r] = ;
if (v[k][r+]) L[l][r+] = ;
} printf("%s\n", C[][n]?"Yes" : "No");
}

最新文章

  1. MAC OS上Nginx安装
  2. Android学习笔记函数
  3. Selenium2学习-025-WebUI自动化实战实例-023-页面快照截图应用之一 -- 常规截图(全页面)
  4. 《图解TCP/IP》
  5. 推荐eclipse velocity一款插件 --- veloeclipse
  6. ARM指令和Thumb指令区别
  7. python学习之字符串(上)
  8. Array.prototype.reduce()
  9. 在chrome上隐藏video的option按钮
  10. SQL通配符
  11. (后台)SQL Server 数据库定时自动备份(转)
  12. mybatis根据数据库表结构自动生成实体类,dao,mapper
  13. Sass入门及知识点整理
  14. suoi63 树与路径 (倍增lca)
  15. Disruptor使用简介
  16. 指针式压力表自动读数:Auto Read the Value of Manometer
  17. input的默认样式去除
  18. 20165330 预备作业3 Linux安装及学习
  19. twitter集成第三方登录是窗口一直出现闪退的解决方法
  20. 容器控件JPanel的使用

热门文章

  1. SSIS父子维度
  2. Golang 入门系列(十三)用Beego开发web应用
  3. redis和mysql同步 终极解决方案
  4. Windows下用cpu模式跑通目标检测py-faster-rcnn 的demo.py
  5. jdk1.6与jdk1.7list集合排序区别与算法
  6. 读取jar包内的文件内容
  7. java构造方法之我见
  8. 零基础逆向工程19_PE结构03_代码节空白区添加代码_shellcode
  9. ArcGIS for Server内置JS Viewer的离线部署和配置
  10. freebsd问题