Codeforces Round #505 D. Recovering BST(区间DP)
首先膜一发网上的题解。大佬们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)相关推荐
- codeforces Round 21 808E. Selling Souvenirs 【dp好题】
codeforces Round 21 808E. Selling Souvenirs [dp好题] E. Selling Souvenirs time limit per test 2 second ...
- Educational Codeforces Round 8 D. Magic Numbers 数位DP
D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...
- Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS
题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...
- Codeforces Round #131 (Div. 2) B. Hometask dp
题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...
- Codeforces Round #374 (Div. 2) C. Journey DP
C. Journey 题目连接: http://codeforces.com/contest/721/problem/C Description Recently Irina arrived to o ...
- Codeforces Round #260 (Div. 1) A - Boredom DP
点击打开链接 题意: 给你n个数,你每次可以选择删除去一个数x,但是等于x+1和等于x-1的数都得删去 你每一次操作可以得x分 思路一: dp[i]表示到i后能够得到的最大分数 dp[i]=max(d ...
- Codeforces Round #387 (Div. 2) 747F(数位DP)
题目大意 给出整数k和t,需要产生一个满足以下要求的第k个十六进制数 即十六进制数每一位上的数出现的次数不超过t 首先我们先这样考虑,如果给你了0~f每个数字可以使用的次数num[i],如何求长度为L ...
- Codeforces Round #505 B. Weakened Common Divisor(思维)
题目链接:http://codeforces.com/contest/1025/problem/B 题意是给了n组数,从每组数里挑一个数出来,求他们的因子,如果没有因子(也就是因子为1) ...
- 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 ...
最新文章
- Linux堆内存管理深入分析
- android软件开发基础课程(一)
- Android 图形系统之gralloc
- @SessionAttributes 和 @SessionAttribute的区别
- 万能驱动xp离线版_教你用SC封装软件来封装XP系统
- ios多线程 -- NSOperation 简介
- 财务报表五力、五性分析雷达图
- leetcode(5)—— Longest Palindromic Substring(最长回文子串)
- yum与apt-get的区别以及两者更新源(阿里/网易【163】)
- 毕设题目:Matlab图像拼接
- 指数函数以及对数函数的导数
- 微支付几个参数的获得
- 淘宝购物流程图 基本流和备选流以及测试用例
- 认识1M带宽、1Mbps、1Mb/s 区分
- XunSearch(讯搜)的使用教程步骤(笔记2)
- java 常见异常汇总_Java常见异常总结
- win10系统升级后,开启热点本机电脑不能上网的解决方案
- oracle自动生成拼音码,oracle 产生拼音码的函数
- 使用广度优先搜索找到最短路径
- 时间管理---规律你的生活