![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
简单dp
文章平均质量分 53
就是刚开始学呗
罚时大师月色
努力让更多小白和我一起共同进步
展开
-
1234. 倍数问题 dp
1234. 倍数问题视频讲解众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。输入格式第一行包括 2 个正整数 n, K。第二行 n 个正整数,代表给定的 n 个数。输出格式输出一行一个整数代表所求的和。数据范围1≤n≤105,1≤K≤103,给定的 n 个数均不超过 108输入样原创 2021-03-10 00:24:32 · 356 阅读 · 0 评论 -
AcWing 1217. 垒骰子 简单dp+快速幂
AcWing 1217. 垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。atm想计算一下有多少种不同的可能的垒骰子方式。两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。由于方案数可能过多原创 2021-03-09 20:07:06 · 210 阅读 · 0 评论 -
AcWing 1070. 括号配对 区间dp
AcWing 1070. 括号配对 Hecy 又接了个新任务:BE 处理。BE 中有一类被称为 GBE。以下是 GBE 的定义:空表达式是 GBE如果表达式 A 是 GBE,则 [A] 与 (A) 都是 GBE如果 A 与 B 都是 GBE,那么 AB 是 GBE下面给出一个 BE,求至少添加多少字符能使这个 BE 成为 GBE。注意:BE 是一个仅由(、)、[、]四种字符中的若干种构成的字符串。输入格式输入仅一行,为字符串 BE。输出格式输出仅一个整数,表示增加的最少字符数。数据原创 2021-03-08 17:41:58 · 176 阅读 · 2 评论 -
AcWing 1226. 包子凑数 背包dp+思维
AcWing 1226. 包子凑数小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 N 种蒸笼,其中第 i 种蒸笼恰好能放 Ai 个包子。每种蒸笼都有非常多笼,可以认为是无限笼。每当有顾客想买 X 个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有 X 个包子。比如一共有 3 种蒸笼,分别能放 3、4 和 5 个包子。当顾客想买 11 个包子时,大叔就会选 2 笼 3 个的再加 1 笼 5 个的(也可能选出 1 笼 3 个的再加 2 笼 4 个的)。当然有时包子大原创 2021-03-08 00:37:27 · 153 阅读 · 0 评论 -
AcWing 1047. 糖果 背包问题
AcWing 1047. 糖果 由于在维护世界和平的事务中做出巨大贡献,Dzx被赠予糖果公司2010年5月23日当天无限量糖果免费优惠券。在这一天,Dzx可以从糖果公司的 N 件产品中任意选择若干件带回家享用。糖果公司的 N 件产品每件都包含数量不同的糖果。Dzx希望他选择的产品包含的糖果总数是 K 的整数倍,这样他才能平均地将糖果分给帮助他维护世界和平的伙伴们。当然,在满足这一条件的基础上,糖果总数越多越好。Dzx最多能带走多少糖果呢?注意:Dzx只能将糖果公司的产品整件带走。输入格式第原创 2021-02-27 20:14:58 · 436 阅读 · 0 评论 -
AcWing 1050. 鸣人的影分身 整数划分问题
AcWing 1050. 鸣人的影分身在火影忍者的世界里,令敌人捉摸不透是非常关键的。我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。影分身是由鸣人身体的查克拉能量制造的,使用的查克拉越多,制造出的影分身越强。针对不同的作战情况,鸣人可以选择制造出各种强度的影分身,有的用来佯攻,有的用来发起致命一击。那么问题来了,假设鸣人的查克拉能量为 M,他影分身的个数最多为 N,那么制造影分身时有多少种不同的分配方法?注意:影分身可以分配0点能量。分配方案不考虑顺序,例如:M原创 2021-02-27 18:44:29 · 113 阅读 · 0 评论 -
AcWing 285. 没有上司的舞会
AcWing 285. 没有上司的舞会 Ural大学有N名职员,编号为1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行一个整数N。接下来N行,第 i 行表示 i 号职员的快乐指数Hi。接下来N-1行,每行输入一对整数L, K,表原创 2021-02-22 22:06:30 · 220 阅读 · 1 评论 -
AcWing 91. 最短Hamilton路径 压缩dp
AcWing 91. 最短Hamilton路径给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。输入格式第一行输入整数n。接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(记为a[i,j])。对于任意的x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]>=a[x,z]。输出格式输出一个原创 2021-02-22 20:44:17 · 1195 阅读 · 3 评论 -
AcWing 291. 蒙德里安的梦想 压缩dp
AcWing 291. 蒙德里安的梦想求把NM的棋盘分割成若干个12的的长方形,有多少种方案。例如当N=2,M=4时,共有5种方案。当N=2,M=3时,共有3种方案。如下图所示:输入格式输入包含多组测试用例。每组测试用例占一行,包含两个整数N和M。当输入用例N=0,M=0时,表示输入终止,且该用例无需处理。输出格式每个测试用例输出一个结果,每个结果占一行。数据范围1≤N,M≤11输入样例:1 21 31 42 22 32 42 114 11`0 0输出样例:原创 2021-02-22 19:47:23 · 134 阅读 · 1 评论 -
AcWing 338. 计数问题
AcWing 338. 计数问题给定两个整数 a 和 b,求 a 和 b 之间的所有数字中0~9的出现次数。例如,a=1024,b=1032,则 a 和 b 之间共有9个数如下:1024 1025 1026 1027 1028 1029 1030 1031 1032其中‘0’出现10次,‘1’出现10次,‘2’出现7次,‘3’出现3次等等…输入格式输入包含多组测试数据。每组测试数据占一行,包含两个整数 a 和 b。当读入一行为0 0时,表示输入终止,且该行不作处理。输出格式每组数据输出一原创 2021-02-22 16:58:08 · 929 阅读 · 1 评论 -
AcWing 900. 整数划分
AcWing 900. 整数划分这是一个计量dp求方案数,我确实没有涉及过,所以我学了y总的视频闫氏分析法还是很厉害的。我们把他变成一个完全背包问题,求价值为w时有多少种方案。核心式子推导dp[i,j]=dp[i-1][j]+dp[i-1][j-i]+dp[i-1][j-2*i]+……+dp[i-1][j-s*i];dp[i,j-i]= dp[i-1][j-i]+dp[i-1][j-2*i]+……+dp[i-1][j-s*i];dp[i,j]=dp[i-1][j]+dp原创 2021-02-22 11:51:56 · 159 阅读 · 0 评论 -
AcWing 282. 石子合并 最简单的区间dp题 区间dp+前缀和
AcWing 282. 石子合并设有N堆石子排成一排,其编号为1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有4堆石子分别为 1 3 5 2, 我们可以先合并1、2堆,代价为4,得到4 5 2, 又合并 1,2堆,代价为9,得到9 2 ,再合并得到11,总代价为4+9+11=24;如果第二步是先合并原创 2021-02-22 10:55:38 · 141 阅读 · 0 评论 -
AcWing 899. 编辑距离
AcWing 899. 编辑距离给定n个长度不超过10的字符串以及m次询问,每次询问给出一个字符串和一个操作次数上限。对于每次询问,请你求出给定的n个字符串中有多少个字符串可以在上限操作次数内经过操作变成询问给出的字符串。每个对字符串进行的单个字符的插入、删除或替换算作一次操作。输入格式第一行包含两个整数n和m。接下来n行,每行包含一个字符串,表示给定的字符串。再接下来m行,每行包含一个字符串和一个整数,表示一次询问。字符串中只包含小写字母,且长度均不超过10。输出格式输出共m行,每行输原创 2021-02-22 10:40:45 · 365 阅读 · 0 评论 -
AcWing 902. 最短编辑距离 线性dp
AcWing 902. 最短编辑距离这道题是用线性dp就可以解决,在这之前,我先给大家介绍一下我们大名鼎鼎的闫氏dp首先我们要考虑状态表示,dp[i,j]表示a[1−-−i]变成b[1−-−j]的最小操作方案数,我们可以假设成dp[i,j]是成功把a[1~~i]变成b[1~j]的然后状态计算,删除操作是在i-1,j已经匹配上了,多了一个i,那么我们就把它删了,插入操作是指,i,j-1匹配上了,但是我们要匹配上i,j需要再加一个字母,如果a[i]==b[j]那么我们就不需要改了,就直接使用dp[i-1原创 2021-02-22 10:16:48 · 1002 阅读 · 3 评论 -
AcWing 9. 分组背包问题
题目链接有 N 组物品和一个容量是 V 的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是 vi[j]vi[j]vi[j],价值是 wi[j]wi[j]wi[j],其中 iii 是组号,jjj 是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行有两个整数 N,V,用空格隔开,分别表示物品组数和背包容量。接下来有 N 组数据:每组数据第一行有一个整数 Si,表示第 i 个物品组的物品数量;每组数据接下来有 Si原创 2021-02-21 23:04:13 · 79 阅读 · 0 评论 -
AcWing 5. 多重背包问题 II 用二进制变成背包问题
AcWing 5. 多重背包问题 IIy总的视频把他拆分二进制,然后可以用这些一堆2i(1-cnt)来组合成0-s的数,如果不能形成想象的二进制数,那我们就把最后的没能形成的作为一部分算进去。然后变成一个背包问题。可能到这一步你们还没有理解,比如说7的二进制数是111可以变成14+12+1*1因为二进制最大是1,也就是只能用一次,背包问题同样也是,背包问题没搞明白的话,可以去看看以前的博文链接所以代码就非常的简单了。代码如下#include<iostream>#inc原创 2021-02-21 22:43:12 · 110 阅读 · 1 评论 -
AcWing 885. 求组合数 I(dp)
Acwing 885给定n组询问,每组询问给定两个整数a,b,请你输出Cba mod (109+7)的值。输入格式第一行包含整数n。接下来n行,每行包含一组a和b。输出格式共n行,每行输出一个询问的解。数据范围1≤n≤10000,1≤b≤a≤2000输入样例:33 15 32 2输出样例:3101这道题我刚开始想到用阶乘去解决。Cba=a!/(b!*!(a-b))然后小数是可以算出来的,但是mod的问题没解决好,时间复杂度也比较高,这个类似于筛法。用了一个简单原创 2021-02-21 11:18:47 · 136 阅读 · 0 评论 -
AcWing 3. 完全背包问题 o(n^2)级别该怎么写
刚开始看到这个题,我以为又可以水一篇博文。第一次我写代码如下#include<iostream>#include<algorithm>using namespace std;const int N=1010;int vi[N],wi[N],dp[N][N];int main(void){ int n,v; cin>>n>>v; for(int i=1;i<=n;i++) cin>>vi[i]&.原创 2021-02-04 08:07:16 · 156 阅读 · 0 评论 -
AcWing 898. 数字三角形
就是递推啦,从后往前dp就行了(水水水一条博文)#include<bits/stdc++.h>using namespace std;const int N=510;int dp[N][N];int a[N][N];int main(void){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&a[i][.原创 2021-02-03 16:06:01 · 175 阅读 · 0 评论 -
AcWing 897. 最长公共子序列
水水水题了https://www.acwing.com/problem/content/899/有点简单,我的核心思路都在代码里了#include<iostream>#include<algorithm>using namespace std;const int N=1010;char a[N],b[N];int dp[N][N];int main(void){ int n,m; cin>>n>>m; scanf原创 2021-02-03 15:59:46 · 180 阅读 · 0 评论 -
Acwing 896.最长上升子序列II(升级版上升子序列)
刚开始做的时候,我还是按往常直接简单dp去做结果自然WA了后来我仔细地分析了一下,在于这是o(n2)级别的算法,题目给了106的数据。很明显,要是想AC就要用o(n)或者0(nlogn)级别的算法,于是我就看视频还有数了解到一种算法。老师网站:https://www.acwing.com/problem/content/video/898/这种方法类似于贪心,然后就是让小的更小,大的更大,这样后面的数更好的找到一个最长递增子序列,然后模拟一下过程很容易理解,然后lower_boun.原创 2021-02-03 15:51:38 · 379 阅读 · 0 评论 -
dp的第一课 Acwing 895.最长上升子序列
这道题是最基础的dp,其实也不是很难,但是需要注意几点,dp[i]的含义是以g[i]最大值最长的上升子序列,之前以为i点之前的最长上升子序列(反正就是想法错了)然后代码如下#include<iostream>#include<algorithm>using namespace std;const int N=1010;int dp[N];int g[N],mx=0,mmx=0;int main(void){ int n; cin>>n;.原创 2021-02-03 11:34:26 · 126 阅读 · 0 评论