首先膜一发网上的题解。大佬们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 = 700 + 10;int n;
int a[maxn];
int v[maxn][maxn], L[maxn][maxn], R[maxn][maxn], C[maxn][maxn];
int dp[maxn][maxn][2];int main()
{scanf("%d", &n);for (int i = 1; i <= n; i++){L[i][i] = R[i][i] = 1;scanf("%d", &a[i]);}for (int i = 1; i <= n; i++)for (int j = i+1; j <= n; j++)v[i][j] = v[j][i] = __gcd(a[i], a[j]) != 1;int r;for (int len = 1; len <= n; len++)for (int l = 1; (r = l+len-1) <= n; l++)for (int k = l; k <= r; k++)if (L[l][k] && R[k][r]){C[l][r] = 1;if (v[k][l-1]) R[l-1][r] = 1;if (v[k][r+1]) L[l][r+1] = 1;}printf("%s\n", C[1][n]?"Yes" : "No");
}

转载于:https://www.cnblogs.com/ruthank/p/9514745.html

Codeforces Round #505 D. Recovering BST(区间DP)相关推荐

  1. codeforces Round 21 808E. Selling Souvenirs 【dp好题】

    codeforces Round 21 808E. Selling Souvenirs [dp好题] E. Selling Souvenirs time limit per test 2 second ...

  2. Educational Codeforces Round 8 D. Magic Numbers 数位DP

    D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...

  3. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

    题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...

  4. Codeforces Round #131 (Div. 2) B. Hometask dp

    题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...

  5. Codeforces Round #374 (Div. 2) C. Journey DP

    C. Journey 题目连接: http://codeforces.com/contest/721/problem/C Description Recently Irina arrived to o ...

  6. Codeforces Round #260 (Div. 1) A - Boredom DP

    点击打开链接 题意: 给你n个数,你每次可以选择删除去一个数x,但是等于x+1和等于x-1的数都得删去 你每一次操作可以得x分 思路一: dp[i]表示到i后能够得到的最大分数 dp[i]=max(d ...

  7. Codeforces Round #387 (Div. 2) 747F(数位DP)

    题目大意 给出整数k和t,需要产生一个满足以下要求的第k个十六进制数 即十六进制数每一位上的数出现的次数不超过t 首先我们先这样考虑,如果给你了0~f每个数字可以使用的次数num[i],如何求长度为L ...

  8. Codeforces Round #505 B. Weakened Common Divisor(思维)

    题目链接:http://codeforces.com/contest/1025/problem/B        题意是给了n组数,从每组数里挑一个数出来,求他们的因子,如果没有因子(也就是因子为1) ...

  9. C. Robot in a Hallway Educational Codeforces Round 133 (Rated for Div. 2)dp

    dp问题 There is a grid, consisting of 22 rows and mm columns. The rows are numbered from 11 to 22 from ...

最新文章

  1. Linux堆内存管理深入分析
  2. android软件开发基础课程(一)
  3. Android 图形系统之gralloc
  4. @SessionAttributes 和 @SessionAttribute的区别
  5. 万能驱动xp离线版_教你用SC封装软件来封装XP系统
  6. ios多线程 -- NSOperation 简介
  7. 财务报表五力、五性分析雷达图
  8. leetcode(5)—— Longest Palindromic Substring(最长回文子串)
  9. yum与apt-get的区别以及两者更新源(阿里/网易【163】)
  10. 毕设题目:Matlab图像拼接
  11. 指数函数以及对数函数的导数
  12. 微支付几个参数的获得
  13. 淘宝购物流程图 基本流和备选流以及测试用例
  14. 认识1M带宽、1Mbps、1Mb/s 区分
  15. XunSearch(讯搜)的使用教程步骤(笔记2)
  16. java 常见异常汇总_Java常见异常总结
  17. win10系统升级后,开启热点本机电脑不能上网的解决方案
  18. oracle自动生成拼音码,oracle 产生拼音码的函数
  19. 使用广度优先搜索找到最短路径
  20. 时间管理---规律你的生活

热门文章

  1. [Python]再学 socket 之非阻塞 Server
  2. jquery文本折叠
  3. js实现购物车数量的增加与减少,js实现购物车数量的自增与自减
  4. Android完全退出程序、线程
  5. iOS中EXC_BAD_ACCESS解决办法
  6. Python函数作为参数传递给函数
  7. Python--高阶学习笔记
  8. 独立集,覆盖集,支配集,最大团,最大匹配
  9. 1.8 简单的文件输入输出
  10. 服务器linux系统支持php好,关于Linux服务器系统的七大优势,你知道几个?