
动态规划
小菜0-o
卷心菜,又卷又菜
展开
-
282. 石子合并
282. 石子合并该有多垃圾啊。#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 1e3+10;int f[N][N];int s[N];int a[N];int n;int main(){ cin>>n; for(int i=1;i<=n;i++) { scanf("%d",&a[i]原创 2022-03-31 21:13:30 · 194 阅读 · 0 评论 -
3138: 动态规划进阶题目之货币面值
思路:既然说叫用动态规划做,那就得往动态规划方面想。自己想的方法不是用动态规划做的,也AC了。但是还是得往动态规划上靠。输入n,有n个面值的钱,还要有一个不能表示的最小钱数,其实应该想到dp数组的雏形了:dp[i][j]表示考虑前i个纸币,在面值总和不超过j的情况下能表示的最大面值(为什么要这样想,为什么是面值总和不超过j情况下这么别扭呢?考虑01背包问题,就是考虑前i个物品,在背包容量不超过j的情况下能放的最大价值。)。这个地方其实是一个恰好装满背包容量的01背包变式题,其实就是所装入的价值恰好等于.原创 2022-03-31 19:43:47 · 608 阅读 · 0 评论 -
Jump game
想要能跳到i块石头上,需要满足什么条件?需要满足两个条件,他能跳到第j块石头上,并且第j块的a[j]>i-j确定状态最后一步:从j跳到i上(要求a[j]>i-j)子问题:怎么跳到第j块石头上?状态方程:设置一个一维数组f[i] =True or False?这取决于f[j]是true还是false,以及能不能从j跳到i得到: f[i] = f[j]&&a[j]>=i-j(状态方程)//好好反思一下为什么少了=j是谁?应该是从0-i的所有的点.需要枚举原创 2022-03-19 18:54:30 · 117 阅读 · 0 评论 -
1456: 3.3.5 A Game 游戏
1456: 3.3.5 A Game 游戏思路:怎么思考?这个题不是简单的动态规划,仔细想想,拿走一个,这一个的左边或者右边就暴露出来,另一个人就可以选这个,那就看这个大还是不大了。之前思考的方向是dp[i]代表第i次取的时候最大的得分,但是这样想显然是错误的,因为它不具备无后效性。所以就没有思路了,就不会了这实际上是个区间dp的题。就是有一段数,我要选从1n的最优解,那么其实我需要知道从ij(i和j都属于1~n)的所有的最优解,然后再写一个状态转移方程就好了。所以难点有两个:一个是得想到是区间dp原创 2022-03-19 17:10:12 · 4704 阅读 · 0 评论 -
898. 数字三角形
898. 数字三角形重走来时路。#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 510;int f[N][N];int n;int main(){ cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++)原创 2022-03-16 21:48:08 · 201 阅读 · 0 评论 -
1220. 生命之树 树型dp
1220. 生命之树dfs。每到一个结点,设置f[i].#include<iostream>#include<string.h>#include<algorithm>#include<vector>using namespace std;const int N = 1e5+10;typedef long long ll;vector<int> G[N];int n,a[N];ll f[N]; //f[i]表示以i为根节点原创 2022-03-16 21:37:36 · 219 阅读 · 0 评论 -
1047. 糖果
1047. 糖果害害害 还是不行啊!!!题解只有f[0][0]是有意义的,f[0][1] f[0][2]都没有意义 因为没有选物品的时候 不可能还有大于0的余数,#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 100+10;int n,k;int a[N];int f[N][N];int get_mod(int a原创 2022-03-06 21:25:59 · 207 阅读 · 0 评论 -
1050. 鸣人的影分身
1050. 鸣人的影分身题解。#include<iostream>#include<cstring>#include<algorithm>#include<stack>using namespace std;const int N = 30;int f[N][N]; //f[i][j]表示总和为i,分配给j个分身的方案数int main(){ int T; cin>>T; while(T--)原创 2022-03-06 20:08:05 · 143 阅读 · 0 评论 -
背包问题整理
文章目录01背包问题朴素算法一维优化完全背包问题二维朴素算法一维优化[多重背包问题 I](https://www.acwing.com/problem/content/4/)[多重背包问题 II](https://www.acwing.com/problem/content/5/)题解二进制优化如何将一个数x合理的划分为二进制数,使这些数可以表示 0~x 之间的任意一个数多重背包问题III题解混合背包问题二维费用的背包问题分组背包问题背包问题求方案数背包问题求具体方案01背包问题朴素算法#includ原创 2022-01-29 20:48:26 · 632 阅读 · 0 评论 -
3420. 括号序列
3420. 括号序列感觉打死我都不会dp 在本子上需要再看完全背包问题#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 5010;const int MOD = 1e9+7;typedef long long LL;int n;char str[N];LL f[N][N]; //都除以1e9+7了必然ll f[i原创 2022-01-27 10:30:22 · 552 阅读 · 0 评论 -
Acwing1222. 密码脱落
1222. 密码脱落这个题目问加上多少个字符,等价于删除多少个字符可以变成回文串等价于 总长度 - 最长回文串长度所以问题转化为,给定一个字符串,如何求其最大回文子序列求最大回文子序列方法一:转化为最长公共子序列将串翻转过来,和原串对比,其最长公共子序列即为原字符串的最大回文子序列法二问最长回文子序列,转化为所有回文子序列中的最大值DP: 1 状态表示:f[L,R]1.1 集合:所有S[L,R]之间的回文子序列的集合1.2 属性:长度的最大值f[0,n-1]即为答案2.状态计算:原创 2022-01-26 17:55:17 · 171 阅读 · 0 评论 -
285. 没有上司的舞会
285. 没有上司的舞会分析样例可知,最大是5 1 2 6 7都去。这么分析: 5可能去,可能不去。每个点分为去和不去两种情况。去,子结点都不能去不去,子节点可以去可以不去,应该取最大值。设f[i][0]表示i去,f[i][1]表示i去。则f[i][0] += max(f[i.son][0],f[i.son][1]) i.son是i所有的子节点f[i][1] += f[i.son][0] i.son是i的所有的子节点。需要先把子节点都处理好在处理根节点。所以用深搜把孩子都处理好再往上翻还原创 2022-01-17 19:37:19 · 212 阅读 · 0 评论 -
1207. 大臣的旅费-树的直径-树型dp+dfs++多看几遍啊
1207. 大臣的旅费树的直径 = 所有点的最长链+次长链的最大值优质题解树型dp某个点的最长链 = 连接该点和其子节点的边 + 子节点的最大值。很像dfs。#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 2e5+10;struct edge{ int v,next,w;}e[N];int cnt = 0;in原创 2022-01-17 19:26:41 · 156 阅读 · 0 评论 -
题目 2253: 蓝桥杯算法提高-和谐宿舍2
题目 2253: 蓝桥杯算法提高-和谐宿舍2题解#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 150;int h[N];int f[N][N]; //f[i][j]表示1~i个作品,j个木板所需的最小的面积和int maxh[N][N]; //maxh[i][j]表示第i~第j个作品最长的int n,m;int ma原创 2022-01-16 17:03:28 · 5574 阅读 · 0 评论 -
AcWing 1205. 买不到的数目
AcWing 1205. 买不到的数目我的打卡这个题非常经典,在小学数奥,NOIP里y总都见过。当成定理记住。有q 和 p两个数res = a*q + b*p,求res最大的不能凑出来的数是多少。a b可取任意值这个题目是不一定有解的。当p q的最大公约数d大于1时,所有不是d的倍数的数都不能凑出来。62不是2的倍数的就都凑不出来了。其实这些都不用考虑。因为题目一定有解。如果p q 互质,则一定有点裴蜀定理如果p q的最大公约数是d,(p,q) = d,则一定存在两个整数满足原创 2022-01-13 16:54:24 · 140 阅读 · 0 评论 -
1214. 波动数列
1214. 波动数列太难想了题解#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 1010;int MOD = 100000007;int n,s,a,b;int f[N][N];int get_mod(int a,int b){ return (a % b + b) % b;}int main(){原创 2022-01-12 19:17:15 · 121 阅读 · 0 评论 -
1212. 地宫取宝
1212. 地宫取宝四维dp是最长上升子序列和摘花生两个题的结合版。二维地图,类似摘花生只有当当前位置的宝物价值严格大于当前背包中任一物品价值时才可拿起。类似最长上升子序列此题数据范围较小,只有50*50 = 2500种情况,这意味着dp的维度可能比较多。样例解读2 3 21 2 32 1 5res = 14从1~5,走不同的路径也是不同的方案数。1 2 3 5这样走,可以任意拿2个,答是C42。 2 3 5这样走,答案是C23 = 3 3原创 2022-01-12 16:00:45 · 210 阅读 · 0 评论 -
3494. 国际象棋
很难!目前还不理解,为什么本来才6行,变成1<<6=64了却是状态压缩呢?乍一看以为这个题是DFS,但是是一个深藏不露的dp还是之前没做过的状态压缩dp看了一下午。DP求解步骤1.找子问题2.状态转移方程 最难3.初始条件和边界条件 最容易忽略4.计算顺序解析传送门状态压缩dp 二进制枚举小的6,循环枚举大的110所以这里for循环枚举列,二进制枚举行f[i][a][b][j] 表示已经放好了前i列,第i列状为b,第i-1列状态为a,一共放了j个马dp原创 2021-11-18 18:11:04 · 371 阅读 · 0 评论 -
8. 二维费用的背包问题
8. 二维费用的背包问题dp[i][j][k]表示考虑前i个物品,体积为j,重量为k时的最大的价值。设v[i] w[i] s[i]分别表示第i个物品的体积,重量,价值。状态转移方程为dp[i][j][k] = max( dp[i][j][k],dp[i-1][j-v[i][k-w[i] + s[i] )但是这个是可以像01背包那样优化的。具体的方法就是不从前往后遍历而从后往前遍历,这样更新的是新的,用的是虽然是同一列,但是是i-1 次,即上次的。所以如果从后往前遍历,就把第一维去掉即可dp原创 2021-11-27 21:41:20 · 135 阅读 · 0 评论