![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
记录
蔡珏
这个作者很懒,什么都没留下…
展开
-
acwing 恨7不成妻
注意完全平方公式的推导。原创 2022-10-22 21:33:55 · 107 阅读 · 0 评论 -
daimayuan 三进制循环(树形dp)
题目传送门这个题目比较简单,思路一下就出来了。维护两个dp,dp1和dp2:dp,dp1和dp2:dp,dp1和dp2:dp1[i]:以点i为起点以及子树符合取模递增的最大长度dp1[i]:以点i为起点以及子树符合取模递增的最大长度dp1[i]:以点i为起点以及子树符合取模递增的最大长度dp2[i]:以点i为起点以及子树符合取模递减的最大长度dp2[i]:以点i为起点以及子树符合取模递减的最大长度dp2[i]:以点i为起点以及子树符合取模递减的最大长度答案就是:ans=max(ans,Σ(dp1原创 2022-05-21 14:07:52 · 91 阅读 · 0 评论 -
daimayuan 国家铁路(前缀和,dp)代码源
1.首先答案必定为 A[x1,y1]+A[x2,y2]+C∗(∣x1−x2∣+∣y1−y2∣)A[x1,y1]+A[x2,y2]+C*(|x1-x2|+|y1-y2|)A[x1,y1]+A[x2,y2]+C∗(∣x1−x2∣+∣y1−y2∣)2.我们想办法去掉绝对值,给选择的两个点规定方向,分别是一个点在左下,一个点右上;一点左上,一个点右下(方向是两个点的相对方向)。1.当左下右上时,维护 m1[i][j]m_1[i][j]m1[i][j] 为左下角到i,ji,ji,j的最小的 C∗(i−j)+A[原创 2022-04-29 00:58:55 · 141 阅读 · 0 评论 -
孤独的树(牛客月赛)
小白月赛最后一题,树形dp有两种方式做,第一种思维要求高一点,第二种代码麻烦一点。解法一:从树形结构自下而上观察本问题(上指的是树根,下指的是叶子)。某个节点,与其子节点有公共的最大公因数,两个节点中必须要有一个要删除他们的最大公因数,删那个的对结果的贡献都是最大公因数的质数组成数。,那么我们删哪一个呢,我们删父节点,删了父节点之后,因为我们是从叶子节点看起,删了父节点,这个gcd的影响就传不到父节点的父节点去了,而且还防止了删了这个子节点的gcd,别的子节点和父节点还有gcd或者这个gcd的因子所原创 2022-04-26 21:13:22 · 284 阅读 · 0 评论 -
daimayuan(代码源oj)最长路径(树形dp,无向树换根dp)
题目传送门/********************************************************************* 程序名: 版权: Joecai 作者: Joecai 日期: 2022-04-14 19:16 说明:*********************************************************************/#include <bits/stdc++.h>usin原创 2022-04-16 10:45:14 · 2261 阅读 · 0 评论 -
流(树形dp,换根dp)
前置知识看这里注意父亲节点为叶子节点的情况就行了/********************************************************************* 程序名: 版权: Joecai 作者: Joecai 日期: 2022-04-13 23:47 说明:*********************************************************************/#include <bi.原创 2022-04-14 11:00:28 · 60 阅读 · 0 评论 -
距离和(换根dp)
传送门/********************************************************************* 程序名: 版权: Joecai 作者: Joecai 日期: 2022-04-13 23:47 说明:*********************************************************************/#include <bits/stdc++.h>using n原创 2022-04-14 10:13:20 · 76 阅读 · 0 评论 -
凸多边形的划分(区间dp)
题目传送门#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll N=100,INF=1LL<<63,M=500;ll f[N][N];int n;ll a[N];bool cmp(vector<ll>& a,vector<ll>& b){ while(a.size()&&a.back()==0) a.pop原创 2022-04-12 11:25:48 · 155 阅读 · 0 评论 -
daimayuan 括号序列(dp)
传送门使用记忆化搜索/********************************************************************* 程序名: 版权: Joecai 作者: Joecai 日期: 2022-04-05 19:47 说明:*********************************************************************/#include <bits/stdc++.h>原创 2022-04-06 00:36:48 · 327 阅读 · 0 评论 -
小国王(状压dp经典题)
#include <bits/stdc++.h>using namespace std;int n, m;const int N = 15;long long dp[N][1100][1 << 13]; //目前的行 选了多少个 目前状态vector<int>v;//每行压缩航的合法状态int check(int x){ int res = 0; for (int i = 0; i <= 31; i++) { if (x >>原创 2022-03-29 13:23:09 · 56 阅读 · 0 评论 -
走楼梯2(Daimayuan Online Judge)
这题我的解法是使用状态机思维且看我下面的状态关系图:这是我给出的三个状态,走一步用0状态表示,走一次两步用1状态表示,走两次两步用状态2表示,他们的转移关系如图对图的解释:1.走一步怎么转移过来的:可以选择继续走一步转移过来(如图中的自环);走两步无论第一次还是第二次走两步,可以下一次走一步。2.走一次两步怎么转移过来的: 可以走一步后选择走两步。3.连续走两次两步怎么转移过来的: 可以走一次两步后再接着走两步。1.状态定义定义f[i,j]f[i,j]f[i,j],iii 为此时是第几个台阶原创 2022-03-28 22:00:52 · 344 阅读 · 0 评论 -
树上染色(树形dp)
参考大佬题解:树上染色原题:洛谷树上染色/********************************************************************* 程序名: 版权: Joecai 作者: Joecai 日期: 2022-03-27 17:35 说明:*********************************************************************/#include <bits/st原创 2022-03-27 19:28:59 · 342 阅读 · 0 评论 -
牛牛的计算机内存(状压dp)
题目大意:每次选择一条指令直到被选完为止,每次选择一条指令的花费为这条指令里面有多少个之前没有被选的内存k,花费加k2k^2k2,求最后的花费最小。1 .n<=20n<=20n<=20选择情况有1<<n−11<<n-11<<n−1种,使用状态压缩。2.dp[i]:ip[i]:ip[i]:i为此时1-n条指令里面的选择情况,dp[i]dp[i]dp[i]为最小花费。vis[i]vis[i]vis[i]: i为此时1−n条指令里面的选原创 2022-03-27 12:43:03 · 334 阅读 · 0 评论 -
数字游戏2(数位dp)
#include <bits/stdc++.h>using namespace std;const int N = 110;int f[11][11][N];//第i位 此时去j 和取模p为多少int p;int mod(int x) { return (x % p + p) % p;}void init() { memset(f, 0, sizeof f); for (int i = 0; i <= 9; i++) f[1][i][i % p]++; f原创 2021-11-05 14:30:37 · 1798 阅读 · 0 评论 -
windy数(数位dp)
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 34;int f[N][10];//第i位取j的windy数 maxll l, r;void init() { for (int i = 0; i <= 9; i++) f[1][i] = 1; for (int i = 2; i <= N; i++) { for (int j = 0; j <= 9原创 2021-11-04 23:19:20 · 102 阅读 · 0 评论 -
数字的游戏(数位dp)
#include<bits/stdc++.h>using namespace std;const int N=20;int f[N][10];int l,r;void init(){ for(int i=0;i<=9;i++) f[1][i]=1; for(int i=2;i<=N;i++) { for(int j=0;j<=9;j++) for(int k=j;k<=9;k++) f[原创 2021-11-04 19:42:44 · 2455 阅读 · 0 评论 -
被3乘除的子序列
被3乘除的子序列这个题目开始拿到手上不知道怎么设置状态转移,很多博客也没解释为什么那样转换是可以的。首先我们要在数学上弄明白:mod 3,是非常特殊的,因为10%3=1,这有什么用呢。如果目前1-i-1的某个子序列此时为x,取余3为k1,i位置数,取余3为k2,如果加上i位置的数的影响此时:这个数就要变成10*x+a[i],对这个数取模mod:(10*xxx+a[i]a[i]a[i])%modmodmod=((10%modmodmod)∗*∗(xxx*%modmodmod)+a[i]a[i]a[i原创 2021-10-30 16:11:29 · 73 阅读 · 0 评论