![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
思维
Are_you_ready
这个作者很懒,什么都没留下…
展开
-
区间内的数不包含某个数字的数的个数(数位dp)
题目:https://www.acwing.com/problem/content/1087/题意:大概意思就是给一个区间[n,m],问这个区间内的数,不包含4并且不包含62的数的个数。例如,62315,73418,88914都不行,61152就可以。1≤n≤m≤10^9题解:数位dp。和之前的几道数位dp题思路完全一样,只是预处理的f数组不同,这里的f数组也比较好推。f[i][j]表示总共有i位,最高位为j且满足题目要求的所有的方案数,预处理dp的时候注意不要包含4,和62即可。#includ原创 2021-09-10 21:08:21 · 867 阅读 · 0 评论 -
HDU - 6156(区间内的数是回文串的个数)(数位dp)
题目:https://vjudge.ppsucxtt.cn/contest/455985#problem/G题意:有T组数据。数的区间[L,R],在进制区间[l,r]内是回文串的个数。意思就是给一个数的区间[L,R],然后又给了一个进制区间[l,r],问在数的区间内,转化成对应的进制后,有多少个数是回文串,是回文串的话,给答案的贡献就是那个进制,否则就是1。比如3在十进制是个回文串,对答案的贡献就是10.它转化成2进制后是11,也是回文串,对答案的贡献是2。1<=T<=1e5,1<=L原创 2021-09-09 15:57:04 · 244 阅读 · 0 评论 -
某区间内的数的各位之和取模后为0的数量(数位dp)
题目:https://www.acwing.com/problem/content/1086/题意:某人又命名了一种取模数,这种数字必须满足各位数字之和 mod N 为 0。现在大家又要玩游戏了,指定一个整数闭区间 [a.b],问这个区间内有多少个取模数。1≤a,b≤2^31 - 1 , 1≤N<100。题解:数位dp。首先,数位dp常规做法,只不过求左子树的时候,不太好求,求左子树的时候需要预处理一个dp数组,就是f[i][j][k],表示总共有i位,最高位是j,取完模后是k的所有合法的数的数原创 2021-09-06 21:31:02 · 368 阅读 · 0 评论 -
某区间内相邻两位之差至少为2的数的个数(数位dp)
题目:https://www.acwing.com/problem/content/1085/题意:Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多少个 Windy 数? 1≤A≤B≤2×10^9样例:[1 10]–9 [25 50]–20题解:数位dp。首先:数位dp老套路,要求[l,r]内符合题目限制的数的个数,那么只需要求出[0,r]的个数和 [0,l-原创 2021-09-06 20:01:24 · 298 阅读 · 0 评论 -
区间内位数大小不降的个数(数位dp)
题目:https://www.acwing.com/problem/content/1084/题意:某人命名了一种不降数,这种数字必须满足从左到右各位数字呈非下降关系,如 123,446。现在大家决定玩一个游戏,指定一个整数闭区间 [a,b],问这个区间内有多少个不降数。1≤a≤b≤2^31 - 1题解:数位dp。首先:要求[l,r]内符合题目限制的数的个数,那么只需要求出[0,r]的个数和 [0,l-1]的个数,两个相互一减,就是[l,r]的个数。其次:从最高位开始分析,假设最高位是x,如果这原创 2021-09-06 17:01:40 · 245 阅读 · 0 评论 -
Rise in Price(杭电多校DP)
题目:https://acm.hdu.edu.cn/showproblem.php?pid=6981题意:给a,b俩个nn的数组,意味着每个i,j位置都会有两个数,从(1,1)开始走,只能往右或者往下走,每走一个格子就能将该位置的a数组的数和b数组的数分别叠加起来,num1代表求从(1,1)走到(n,n),a数组叠起来的值,num2代表b数组叠加起来的值,求一条路径,使得从(1,1)走到(n,n)num1num2最大值是多少。题解:dp,参考官方题解:代码:#include <algorit原创 2021-07-28 16:25:03 · 139 阅读 · 0 评论 -
I love exam(杭电多校赛&分组背包)
题目:https://acm.hdu.edu.cn/showproblem.php?pid=6968题意:n门课,m个复习资料,每一个复习资料花费一些天数能够让对应科目提高一些分数,每门课最多100分,让在T天的情况下,允许挂P门课,最多能够获得多少分数(每门课得分加和),科目小于60就挂了,每门课初始为0。题解:先将每一个复习资料分到对应的科目,做一个分组背包f[i][j]表示第i门课花费j天最多能获得多少分数,然后定义一个数组dp[i][j][k]表示前i门课花费了j天挂了k们最多获得的分数,具体翻译 2021-07-27 09:06:55 · 160 阅读 · 0 评论 -
I love max and multiply(杭电多校赛)
题目:https://acm.hdu.edu.cn/showproblem.php?pid=6971题意:给一个A数组和一个B数组,求出一个C数组,求的方式是,C数组的下标k,A、B数组的下标分别是i、j, Ck=max{Ai*Bj} 并且还要满 足(i&j≥k)代码:#include <algorithm>#include <bitset>#include <cmath>#include <cstdio>#include <cst原创 2021-07-23 13:20:55 · 327 阅读 · 2 评论 -
Just another Robbery(概率&01背包)
题目:https://vjudge.z180.cn/problem/LightOJ-1079题意:首先给你一个最大被抓的概率p和n家银行,每一家银行有一个金钱wi和被抓概率pi,问在不超过p的前提下,最多能够获得多少金钱。题解:01背包,把金钱当背包容量,1-pi当价值,然后求价值最大就好,再从大到小扫一遍背包,找到第一个大于1-p的那个背包容量,就是答案,,,pi是被抓概率,转化为1-pi就是不被抓概率,那么求在当前背包容量下不被抓概率的最大值。#include <algorithm>原创 2021-06-09 08:37:00 · 124 阅读 · 0 评论 -
1077. 皇宫看守(树状DP&选部分点看守全部点)
题目:https://www.acwing.com/problem/content/1079/题意:一个点可以看守它连的所有点,每一个点放看守人员的花费不一样,问最小花费多少花费,看守所有点。y总讲解:#include <algorithm>#include <bitset>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#in原创 2021-06-02 20:24:03 · 184 阅读 · 0 评论 -
1073. 树的中心(1个点到其他点最远距离最短)
题目:https://www.acwing.com/problem/content/1075/题意:给一颗树,每个点到其他点都有一个最远距离,求这些最远距离中最短的距离。题解:分为两步先求从某个点往下搜的最远距离和次远距离(参考这个题)然后再求从这个点往父节点搜的最远距离,往父节点找最远距离的时候需要用到上一次搜索记录一些情况,父节点往下搜的最远距离是不是我这个点,如果是的话我这个点找往父节点的最远距离的时候就是父节点往下搜的次远距离和它(他是本节点的父节点)的父节点的最远距离的最大值,不是的那就是父原创 2021-06-01 09:24:34 · 278 阅读 · 0 评论 -
1072. 树的最长路径(树形DP)
题目:https://www.acwing.com/problem/content/1074/题意:n个点n-1条边的无向图树,每条边都有一个权值,可正可负,求最大权值。题解:树形dp,,任取一个点为根节点,记录每个节点往下搜的所有路径的权值,找到最大权值和第二大权值,以这个点为核心的最大权值的路径就是这俩权值和。#include <algorithm>#include <bitset>#include <cmath>#include <cstdio&g原创 2021-05-29 20:57:48 · 275 阅读 · 0 评论 -
524. 愤怒的小鸟(状压DP&重复覆盖问题)
题目:https://www.acwing.com/problem/content/526/题意:给你一些点,求最少需要经过原点的抛物线经过所有点。题解:次抛物线经过原点,所以简单推一下抛物线公式,可以发现,只要两个点就能确定一条抛物线,,,,,,所以枚举任何俩个点确定的抛物线,看这个抛物线都经过哪些点,用二进制存储下来经过的点1代表经过这个点,,(先用dfs思维理解下,例如,当你跑完10010这个情况后,以后的搜索再搜到这个情况,其实就不用往下搜了,因为这个情况往后面继续跑的情况你已经跑过一遍了,所以原创 2021-05-29 11:13:40 · 172 阅读 · 1 评论 -
292. 炮兵阵地(状压DP棋盘式&滚动数组&三排关系)
题目:https://www.acwing.com/problem/content/294/题意:给一个包含H和P的网格图,P代表可以放东西,H代表不能放东西,并且俩个东西不能互相攻击到,攻击范围如下图,问最多能够放多少东西。题解:状压DP,这里要开三维,f[i][j][k],第一维是题目给的n,第二维代表上一层的所有状态,第三维代表本层的所有状态,这样就可以表示了,这样开三维空间,会炸内存,所以第一维用滚动数组(写法和普通数组一样,只是用数组的时候第一维&1就ok了)y总讲解:#inc原创 2021-05-28 19:08:04 · 147 阅读 · 0 评论 -
1064. 小国王(状压DP&棋盘式)
题目:https://www.acwing.com/problem/content/1066/在 n×n 的棋盘上放 k 个国王,国王可攻击相邻的 8 个格子,求使它们无法互相攻击的方案总数。输入格式共一行,包含两个整数 n 和 k。输出格式共一行,表示方案总数,若不能够放置则输出0。数据范围1≤n≤10,0≤k≤n2题解:状压DP,第i行只与第i-1行有关系,每一行的所有方案都可以用一个二进制状态来表示,1表示放置了国王,0表示没有,,f[n][m][k],第一维是棋盘n,第二维是放了几原创 2021-05-27 17:46:09 · 332 阅读 · 0 评论 -
C. Parsa‘s Humongous Tree(树形dp)
http://codeforces.com/contest/1529/problem/C题意:每个点给一个可以选的范围,俩个点的边权是俩个点相减的绝对值,问能够形成的这个树的边权和最大是多少。题解:树形DP#include <algorithm>#include <bitset>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#原创 2021-05-25 16:24:38 · 242 阅读 · 0 评论 -
D. Armchairs(DP)
题目:https://codeforces.ml/contest/1525/problem/D题意:初始给n个数,只有1和0,让1的位置全部挪去初始为0的位置的最小步数,挪一下是abs(i-j)#include <algorithm>#include <bitset>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include原创 2021-05-21 19:35:19 · 135 阅读 · 0 评论 -
状压DP(最短Hamilton路径)
给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径。Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。https://www.acwing.com/problem/content/93/解:状压dp,找最倒数第二个是走的哪个点,根据我这个数的这个状态减去倒数第二个那个数的状态来确定我这个数的这个状态的最小值。y总讲解:#include <algorithm>#include <bit原创 2021-05-14 21:10:27 · 187 阅读 · 0 评论 -
状压DP(蒙德里安的梦想)
求把 N×M 的棋盘分割成若干个 1×2 的的长方形,有多少种方案。例如当 N=2,M=4 时,共有 5 种方案。当 N=2,M=3 时,共有 3 种方案。https://www.acwing.com/problem/content/293/目标是放横着的,只要横着的放完,竖着的没得选择,所以所有横着放的方法就是总的方案数。y总讲解:#include <algorithm>#include <bitset>#include <cmath>#include原创 2021-05-14 18:41:25 · 180 阅读 · 0 评论 -
至多删三个字符 (30 分)(dp删字符不重复的字符串的数量)
给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串?输出格式:在一行中输出至多删掉其中 3 个字符后不同字符串的个数。输入样例:ababcc输出样例:25#include <algorithm>#include <bitset>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>原创 2021-04-07 11:34:26 · 304 阅读 · 0 评论 -
最短编辑距离acwing(dp(用增删改三个操作让a字符串变成b字符串的最小操作次数))
acwing:y总讲解题目:https://www.acwing.com/problem/content/901/可能需要报课才能做。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e3 + 100;int n,m;char a[N],b[N];int f[N][N];int main(){ cin>>n; cin>>(原创 2021-01-31 14:56:04 · 197 阅读 · 0 评论 -
最长上升子序列 II(长度很大&&n*log(n))
题目:https://www.acwing.com/problem/content/898/题解:找1-k分别代表长度为1-k的最长上升子序列,然后如果长度为k的最长上升子序列有俩个,一个结尾数为7,一个结尾数为5,那么肯定以5结尾的这个最长上升子序列更容易在后面再增长度,所以保留这个5就可以了,7这个就没必要保留,因为可以在7后面接,一定可以在5后面接,,,,所以就更新长度为1-k的最长上升子序列的最小值就可以了(这1-k个最长上升子序列的结尾值一定是递增的),,,枚举n个数的复杂度是n,然后每次二分查原创 2021-01-30 18:26:59 · 114 阅读 · 0 评论 -
石子合并acwing(区间dp)
题意:n堆石子,每一对石子有一个重量,合并相邻的俩堆,合并代价为俩堆的质量之和,求n堆石子合并为一堆后最小的代价。题目:https://www.acwing.com/problem/content/284/题解:区间dp,枚举区间长度,然后再枚举这个区间内每一个点为最后的合并点。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 310+10,inf=1e9;int n;i原创 2021-01-30 14:17:44 · 126 阅读 · 0 评论 -
多重背包问题(二进制优化)
题目:https://www.acwing.com/problem/content/5/优化:将每一个商品的数量用二进制的方法分割一下,如:这件商品本来有200个,我就可以分割成1,2,4,8,16,32,64,73,这样这几个数每一个数最多只能用一次,那么这几个数任意组合就可以组成小于等于200的任何数,利用这个思想,将每一件商品的数量都进行这样的划分重新组合成新的商品,然后跑一边01背包就行。#include <bits/stdc++.h>using namespace std;ty原创 2021-01-29 20:48:09 · 161 阅读 · 0 评论 -
货币系统(v个数无限使用凑成n的方案数&&完全背包)
给定 V 种货币(单位:元),每种货币使用的次数不限。不同种类的货币,面值可能是相同的。现在,要你用这 V 种货币凑出 N 元钱,请问共有多少种不同的凑法。输入格式:第一行包含两个整数 V 和 N。接下来的若干行,将一共输出 V 个整数,每个整数表示一种货币的面值。输出格式:输出一个整数,表示所求总方案数。数据范围1≤V≤25,1≤N≤10000答案保证在long long范围内。题目:https://www.acwing.com/problem/content/1373/大佬:h原创 2021-01-28 16:04:40 · 188 阅读 · 0 评论 -
G - Nim plus Gym - 102878G(博弈题,dp做法(类似背包))
题意:俩个人,总共有n个球,每个人每次只能拿a[i]个球,每个人分别有m 个a[i],题目保证a[i]单调递增,当谁不能拿球的时候他就输了。题目:https://vjudge.net/contest/413430#problem/G题解: 一位大佬朋友写的代码,本菜鸡只是理解后翻译了一下。这里的dpl和dpm的值只有0和1,代表桌子上剩余i个球的时候,这个时候谁去拿,他是会输还是会赢,所以会有dpl[i]=dpm[i]的情况,这个时候谁去拿谁都能保证自己赢,就看谁先手了,因为龙龙是先手,所以这种情况龙原创 2020-12-21 21:27:38 · 248 阅读 · 0 评论 -
Evolution Game[dp] (选择步骤最长的)
https://vjudge.net/contest/396756#problem/C题意就是选择最长的一个满足题意的递增个数#include <bits/stdc++.h>using namespace std;const int maxx = 5000 + 100;struct node{ int point; //记录原始的点 int number; //记录角的个数} a[maxx];int dp[maxx]; bool cmp(node b原创 2020-09-25 20:08:15 · 94 阅读 · 0 评论 -
G - Research Productivity Index (期望dp)
https://vjudge.net/contest/394560#problem/G题目意思是总共有n个论文,每篇论文都有一个被接受的概率,求被接受的最大期望,提交i篇论文,被接受j篇,,,求这个的最大,,首先把概率排序,从大到小,然后用dp求前i个论文,被接受j个的概率,然后再乘以相应的题目给的公式就OK概率的转移方程是 d [ i ] [ j ] = d [ i − 1 ] [ j ] ∗ ( 1 − a [ i ] ) + d [ i − 1 ] [ j − 1 ] ∗ a [ i ] d[i翻译 2020-09-19 20:32:05 · 299 阅读 · 0 评论 -
H - Berland Prospect Gym - 102348H (线性dp)
H - Berland Prospect Gym - 102348H题目:https://vjudge.net/contest/390871#problem/H题目大意:给你一个递增的数组,让你找一个最长的等差序列,输出长度。解题思路:dp[i][j]dp[i][j]表示从位置ii开始公差为k=a[j]−a[i]k=a[j]−a[i]的最长序列,那么我们从后往前就有dp[i][j]=max(dp[i][j],max(2,dp[j][idx[a[j]+k]]+1))dp[i][j]=max(dp[i][翻译 2020-08-25 11:11:43 · 243 阅读 · 0 评论 -
Common Subsequence Gym - 102307C(最长公共子序列 n比较大 )
Manuel thinks that Diego is his long lost brother. But Diego thinks Manuel is wrong, and to prove it, he got DNA samples from himself and Manuel. Now Diego has given you the DNA samples and it is your task to say whether they are brothers or not.The DNA s原创 2020-08-18 10:05:17 · 161 阅读 · 0 评论 -
D - Pick The Sticks HDU - 5543(特殊的01背包,dp,放金条超出背包空间)
D - Pick The Sticks HDU - 5543The story happened long long ago. One day, Cao Cao made a special order called “Chicken Rib” to his army. No one got his point and all became very panic. However, Cao Cao himself felt very proud of his interesting idea and en原创 2020-08-13 21:29:45 · 246 阅读 · 0 评论 -
G - The Debut Album URAL - 2018(1最长a个,2最长b个,总长n,有多少种可能)
G - The Debut Album URAL - 2018Pop-group “Pink elephant” entered on recording their debut album. In fact they have only two songs: “My love” and “I miss you”, but each of them has a large number of remixes.The producer of the group said that the album sh原创 2020-08-11 20:48:22 · 108 阅读 · 0 评论 -
最长上升子序列(快速)
最长上升子序列和找有多少个递减的其实是一个事情;如8 4 2 5 3 9 1 6 7这个序列,找最长上升子序列,以下代码的过程就是,8 4 2 1都在N[0]那里变化,5 3在N[1]那里变化9 6在N[2]那里变化 7在N[3]那里变化,所以最后的数组是1 3 6 7,长度为4;#include <iostream>#include <string>#include <cstring>#include <queue>#include <原创 2020-08-03 15:17:23 · 146 阅读 · 0 评论 -
sdut 上升子序列
上升子序列Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description一个只包含非负整数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列{a1, a2, …,aN},我们可以得到一些上升的子序列{ai1, ai2, …, aiK},这里1 ≤ i1 < i2...原创 2020-04-23 17:19:11 · 467 阅读 · 0 评论 -
sdut 最长上升子序列
最长上升子序列Time Limit: 3000 ms Memory Limit: 65536 KiBProblem Description一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1<= i1 < i2...原创 2020-04-23 11:39:26 · 424 阅读 · 0 评论 -
sdut 最长公共子序列问题
最长公共子序列问题Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description给定两个序列 X={x1,x2,…,xm} 和 Y={y1,y2,…,yn},找出X和Y的最长公共子序列。Input输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。Output...原创 2020-04-23 11:24:42 · 702 阅读 · 0 评论