随笔分类 -  dp

摘要:数位DP - AcWing 338 - 计数问题 注意前导0的影响 #include <bits/stdc++.h> using namespace std; int a, b; int num[10]; int dp[10][10]; // 当前填位i,tar数已经出现的次数j int dfs(i 阅读全文
posted @ 2021-04-19 10:25 popozyl 阅读(60) 评论(0) 推荐(0)
摘要:数位dp第二维j维护什么? 数位dp的dp数组维护的信息应该灵活选择。通常来说第一维i都表示当前填第i位,第二维则根据需要选择。 之前做过的windy数由于需要比较相邻的数,因此j表示上一位填的数是什么。 对于AcWing1081-度的数量,需要维护之前已经出现过的1的数量,因此用j表示。 #inc 阅读全文
posted @ 2021-04-18 12:01 popozyl 阅读(70) 评论(0) 推荐(0)
摘要:其实dp思路并不难,这里仅仅提一句,solve(n, k, dir)中,dp[p][k][dir]的状态更新与n有关,因此后面的样例不能复用前面的样例得到的状态,必须在每组样例前init dp。 另外我的另一份代码T了,不会分析复杂度。而且这个T的代码本机sample还能出结果,AC代码反而T了。( 阅读全文
posted @ 2021-04-12 15:34 popozyl 阅读(84) 评论(0) 推荐(0)
摘要:两道数位dp入门题 1. Luogu P4999 - 烦人的数学作业 #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod = 1e9+7; int t; ll l, r; int num[3 阅读全文
posted @ 2021-04-11 20:59 popozyl 阅读(67) 评论(0) 推荐(0)
摘要:#include <bits/stdc++.h> using namespace std; const int N = 20+5; int t; int inf; int maxlen; int m, n; char a[N], b[N]; int dp[N][N][N]; // dp[i][j][ 阅读全文
posted @ 2021-04-09 08:16 popozyl 阅读(74) 评论(0) 推荐(0)
摘要:CodeForces - Problem 1442 A - Extreme Subtraction - DP 这是一道构造题,之前没练过构造.思路是贪心,DP #include <bits/stdc++.h> using namespace std; int n,t; int v[30000+4]; 阅读全文
posted @ 2020-11-17 15:35 popozyl 阅读(144) 评论(0) 推荐(0)
摘要:CodeForces - Problem 1447 - Catching Cheaters - DP #include <bits/stdc++.h> using namespace std; const int N = 5000+5; char a[N],b[N]; int dp[N][N]; / 阅读全文
posted @ 2020-11-17 12:22 popozyl 阅读(89) 评论(0) 推荐(0)
摘要:矩阵快速幂(入门) 定义及模板 对于方阵存在求幂运算的概念。对于单个数值,我们通过将指数进行二进制拆分的思想将求幂运算的复杂度降至log(n),这种思想同样可以应用到方阵的求幂运算中。事实上,方阵的快速幂与单个数值的快速幂的写法完全一致,只需要对于乘法、取模进行运算符重载即可。 下面给出矩阵快速幂的 阅读全文
posted @ 2020-10-11 19:55 popozyl 阅读(181) 评论(0) 推荐(0)
摘要:DP解出栈序列数 状态转移方程 dp[i][j] = dp[i-1][j] + dp[i][j-1] 意义:入栈$i$个元素,出栈$j$个元素,所得到的出栈序列数 方程解释: 入栈$i$次,出栈$j$次的出栈序列数有以下两种情况: 入栈$i-1$次,出栈$j$次,第$i$个入栈元素不弹出 \(dp[ 阅读全文
posted @ 2020-09-21 09:47 popozyl 阅读(238) 评论(0) 推荐(0)
摘要:写在前面:在看这篇题解前,首先需要学会基本的树型dp是什么,推荐一道题,是本题的简单版。 传送门 本题:题目链接 这是我第一次接触最大连通子树的题。 常规的树型DP,是先dfs求取子树的最优解,再回溯更新父节点的最优解。比如构造一棵最值线段树的过程就是这样: 每一个节点的最优解只受到子节点的影响,而 阅读全文
posted @ 2020-03-18 10:41 popozyl 阅读(450) 评论(0) 推荐(0)
摘要:这道题想了好久。看到这篇题解后瞬间懂了。关键理解这句话:选择哪个点为根对结果没有影响,毕竟任意连通分量在任意时刻总是可以看成一颗以某个点为根的数。 一想通后,这个题就和普通的树上dp没有任何区别了。 代码: #include <iostream> #include <vector> #define 阅读全文
posted @ 2020-03-17 13:18 popozyl 阅读(393) 评论(0) 推荐(0)
摘要:https://www.luogu.com.cn/problem/P1352 开二维数组 dp[ Maxsize ][ 2 ] dp[ i ][ 0 ] 表示上司 i 不参加舞会的最优解, dp[ i ][ 1 ]不参加舞会的最优解。 易得方程:dp[ i ][ 0 ] = 每一个孩子节点 x : 阅读全文
posted @ 2020-03-17 11:10 popozyl 阅读(205) 评论(0) 推荐(0)
摘要:https://www.luogu.com.cn/problem/P1043 首先,如果学会了这篇题解的思路,那么你应该还可以做对这道题目。 好了,进入正题。 对于题目中的环形,很容易想到破环成链进行处理(当然,对于初次接触'环形'应该比较难想,这里说容易想是建立在接触过类似的题目(如'能量项链'等 阅读全文
posted @ 2020-03-16 21:01 popozyl 阅读(274) 评论(0) 推荐(0)
摘要:1 #include <iostream> 2 #include <string> 3 #define Maxsize 5000+1 4 #define MIN(a,b) (a<b?a:b) 5 #define MINN(a,b,c) (MIN(a,b)<MIN(a,c)?MIN(a,b):MIN( 阅读全文
posted @ 2020-03-14 10:48 popozyl 阅读(165) 评论(0) 推荐(0)
摘要:很容易想到用DP或记忆化搜索解决。 状态转移方程: dp[i][j] = MAX(dp[i][j] , 1 + dp(neighbor) ) 注意dp[i][j] 先要全部置1 由于记忆化搜索的做法没什么特别的,就是一个dfs+标记数组,就不多写了。 如何DP?这道题显然不能常规的线性DP,因为子问 阅读全文
posted @ 2020-03-14 10:20 popozyl 阅读(224) 评论(0) 推荐(0)
摘要:https://www.luogu.com.cn/problemnew/solution/P2015 解法1:记忆化搜索 1 #include <iostream> 2 #include <cstring> 3 #include <vector> 4 #define MAX(a,b) (a>b?a: 阅读全文
posted @ 2020-03-13 22:32 popozyl 阅读(234) 评论(0) 推荐(0)
摘要:https://vjudge.net/contest/353157#problem/A 一开始用的记忆化搜索= = 样例能过不知道为啥提交WA = 。= = 。= 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 阅读全文
posted @ 2020-01-28 10:46 popozyl 阅读(160) 评论(0) 推荐(0)
摘要:https://vjudge.net/contest/353156#problem/A 一开始想着按背包做 = = 我的dp还是太菜了 应该按照单调序列做 1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 using 阅读全文
posted @ 2020-01-27 12:35 popozyl 阅读(135) 评论(0) 推荐(0)
摘要:1. 0 1 背包问题: 1 #pragma GCC optimize("Ofast") 2 #include <iostream> 3 #include <algorithm> 4 #define Maxsize 100 + 1 5 using namespace std; 6 typedef l 阅读全文
posted @ 2020-01-15 16:02 popozyl 阅读(122) 评论(0) 推荐(0)
摘要:一维01背包只涉及重量、价值、容量三个变量间的限制关系。 多维01背包实际上思路和一维一样,只不过让重量这个变量多了一种(比如时间?成本?) 实际上解决的思路就是再加一重循环就行。 例题:https://www.luogu.com.cn/problem/P1855 代码: 1 #include <i 阅读全文
posted @ 2020-01-04 15:40 popozyl 阅读(984) 评论(0) 推荐(0)