摘要: 区间dp问题是在定义状态时,定义了一个区间 区间dp的状态表示一般是dp[i][j],表示从i到j这个区间,也就是从第i堆石子到第j堆石子这个区间 以最后一次合并的分界线的位置,来进行集合的划分 假设从i到j一共有k个,k = j - i + 1 按照左右两堆左边有几个来划分,左边有1个,2个,.. 阅读全文
posted @ 2020-07-03 23:34 kyk333 阅读(178) 评论(0) 推荐(0)
摘要: 时间复杂度1000 * 1000 * 100 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 15, M = 1010; 4 int n, m; 5 char str[M][N]; 6 int dp[N][N]; 7 阅读全文
posted @ 2020-07-03 21:24 kyk333 阅读(163) 评论(0) 推荐(0)
摘要: 时间复杂度n ^ 2 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1010; 4 int n, m; 5 char a[N], b[N]; 6 int dp[N][N]; 7 int main() { 8 cin 阅读全文
posted @ 2020-07-03 20:10 kyk333 阅读(198) 评论(0) 推荐(0)
摘要: 时间复杂度n^2 debug过程 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1010; 4 char a[N], b[N]; 5 int dp[N][N]; 6 int main() { 7 int n, m; 阅读全文
posted @ 2020-07-03 19:18 kyk333 阅读(151) 评论(0) 推荐(0)
摘要: 时间复杂度n * log n 加个二分 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 100010; 4 int a[N]; //存储每一个数 5 int q[N]; //不同长度的上升子序列结尾的最小值 6 in 阅读全文
posted @ 2020-07-03 13:40 kyk333 阅读(167) 评论(0) 推荐(0)
摘要: 如果不存在就不用去求最大值了,我们只求存在的最大值 如果存在,比如上一个数是j,且a[j] < a[i] aj ai这种情况 dp[j] + 1 所以dp[i] = max(dp[j] + 1),需满足aj < ai,j = 0, 1, ..., i - 1 时间复杂度:n * n 1 #inclu 阅读全文
posted @ 2020-07-03 11:43 kyk333 阅读(165) 评论(0) 推荐(0)
摘要: 先来解释一下什么是线性dp 在求状态转移方程时,有明显的线性求取顺序 比如背包问题 这道题目我们先给数字编号 分析 dp问题的时间复杂度如何分析 一般是状态数量乘以转移的计算量(就是算每个状态需要的计算量) 本题大致就是500 * 500 1 #include <bits/stdc++.h> 2 u 阅读全文
posted @ 2020-07-03 09:51 kyk333 阅读(230) 评论(0) 推荐(0)