动态规划
究极无敌暴龙战神
无限进步
展开
-
单调队列优化DP
【代码】单调队列优化DP。原创 2022-11-08 23:13:31 · 191 阅读 · 1 评论 -
数位DP习题
数位DP习题。原创 2022-10-31 21:25:58 · 431 阅读 · 0 评论 -
状态压缩DP
小国王#include<bits/stdc++.h>using namespace std;typedef long long LL;const int N=12,M=1<<10,K=110;LL f[N][K][M]; //f[i][k][j]=x,表示前i行放了k个国王且当前状态时j的所有方案数int cnt[M]; // cnt[i]=j , 表示状态i的1的个数为j个vector<int>state; // state[i]=j // i单纯表示下原创 2022-03-15 22:01:39 · 264 阅读 · 0 评论 -
区间Dp问题
石子合并#include<bits/stdc++.h>using namespace std;const int N=310;int n;int f[N][N];int a[N];int main(){ cin >> n; memset(f,0x3f,sizeof f); for(int i=1;i<=n;i++){ cin >> a[i]; a[i]+=a[i-1]; f[i][原创 2022-03-06 18:43:21 · 154 阅读 · 0 评论 -
背包类题型
宠物小精灵之收服//二维费用的01背包,值得注意的是 我们平常做题时,费用可以为0,即是范围为0~v//,本题限制了费用不能为0,即范围是1~v那么我们只需要改变一下范围就好了即//变为 0~v-1 就可以直接套用模板了#include<bits/stdc++.h>using namespace std;int n,m,k;int use[1010],hurt[1010];int f[1010][510];int main(){ cin >> m >原创 2022-02-13 22:28:16 · 503 阅读 · 0 评论 -
最长上升子序列模型题目
友好城市//轻量级思维题目 将题目转化为最长上升子序列问题 #include<bits/stdc++.h>using namespace std;const int N=1e4+10;pair<int,int>p[N];int n;int f[N];int main(){ cin >> n ; for(int i=1;i<=n;i++){ cin >> p[i].first >> p[i].s原创 2022-02-13 10:10:10 · 492 阅读 · 0 评论 -
dp算法.
01背包有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000<vi,wi≤1000输入样例4 51转载 2022-01-20 10:20:51 · 140 阅读 · 0 评论 -
洛谷 线性Dp官方题单 个人题解(持续更新)
尼克的任务 题目链接暴力做法#include<bits/stdc++.h>using namespace std;const int N=1e4+10;struct aaa{ int st,len;}a[N];int f[N];bool st[N];int sum,n,ans;vector<int>v[N];void dfs(int t,int fre){ if(t==sum+1){ ans=max(ans,fre);原创 2021-04-27 10:55:24 · 534 阅读 · 0 评论 -
和最大的子序列
HINT:一定要选,不能不选!!!!!!!!!!! dxt得到了一个数列。别问我为什么,反正他得到了。这次他想要从数列中取下连续的一段带走。同时,他想让他取下的这一段总和尽可能大。例如,对于数列(6,-1,5,4,-7),dxt取下第1位到第4位这一段,总和为:6 + (-1) + 5 + 4 = 14,即是总和最大的一段。Input 第一行是一个整数T,表示有T组数据。(1≤T≤20)接下来T行,每行先是一个整数N(1≤N≤100000),表示数列的长度。然后是N个数,表示这个数列。数列中转载 2021-04-24 15:35:18 · 125 阅读 · 0 评论 -
最长公共子序列 含记忆化搜索版本+路径输出
给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。输入格式第一行包含两个整数 N 和 M。第二行包含一个长度为 N 的字符串,表示字符串 A。第三行包含一个长度为 M 的字符串,表示字符串 B。字符串均由小写字母构成。输出格式输出一个整数,表示最大长度。数据范围1≤N,M≤1000输入样例:4 5acbdabedc输出样例:3纯dp转态表示:f[i][j]表示从a串前i个选b串前j个选的所有集合属性:最大值转载 2021-04-22 19:22:34 · 220 阅读 · 0 评论 -
乌龟棋
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。乌龟棋的棋盘只有一行,该行有 N 个格子,每个格子上一个分数(非负整数)。棋盘第 1 格是唯一的起点,第 N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。乌龟棋中共有 M 张爬行卡片,分成 4 种不同的类型(M 张卡片中不一定包含所有 4 种类型的卡片),每种类型的卡片上分别标有 1、2、3、4 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌转载 2021-04-22 08:26:39 · 126 阅读 · 0 评论 -
摆花
小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆。通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号。为了在门口展出更多种花,规定第 i 种花不能超过 ai 盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。试编程计算,一共有多少种不同的摆花方案。输入格式第一行包含两个正整数 n 和 m,中间用一个空格隔开。第二行有 n 个整数,每两个整数之间用一个空格隔开,依次表示 a1,a2,…,an。输出格式输出只有一行,一个整数转载 2021-04-21 22:39:28 · 105 阅读 · 0 评论 -
蓝桥杯 画中漂流
题目描述在梦境中,你踏上了一只木筏,在江上漂流。根据对当地的了解,你知道在你下游 D 米处有一个峡谷,如果你向下游前进大于等于 D 米则必死无疑。现在你打响了急救电话,T 秒后救援队会到达并将你救上岸,水流速度是 1 米/秒,你现在有 M 点体力。每消耗一点体力,你可以划一秒桨使船向上游前进 1 米,否则会向下游前进 1 米(水流),M 点体力需在救援队赶来前花光。因为江面太宽了,凭借你自己的力量不可能上岸,请问,有多少种划桨的方案可以让你得救。两个划桨方案不同是指:存在某一秒钟,一个方案划桨,转载 2021-04-21 15:48:21 · 305 阅读 · 0 评论 -
关于动态规划和记忆化搜索
我觉着吧,这两个东西没有本质上的区别,或者说其实是一种思想的两种表达方式,dp是一种自下而上的思维,就是通过某一步的积累逐渐推到目标状态;而记忆化搜索是一种自上而下的思维,就是从题中所给的状态开始,然后往下搜索需要达到这一步的每个状态;这里给出01背包的两种做法记忆化搜索#include<bits/stdc++.h>using namespace std;const int N=1010;int f[N][N]; // f[i][j]表示在背包体积为j的情况下从前i个背包中选,所能原创 2021-04-21 15:27:00 · 357 阅读 · 0 评论 -
守望者的逃离
恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为17m/s17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s1s内移动60m60m,不过每次使用闪烁法术都会消耗魔法值1010点。守望者的魔法值恢复的速度为44点/s/s,只有处在原地休息状态时才能恢复。现在已知守望者的魔法初值MM,他转载 2021-04-20 22:55:12 · 459 阅读 · 0 评论 -
钞票问题 动态规划
先来看看生活中经常遇到的事吧——假设您是个土豪,身上带了足够的1、5、11元面值的钞票。现在您的目标是凑出某个金额15,需要用到尽量少的钞票//状态表示,用一个一维数组 a[i] 表示金额为i时所需要用到的最小纸张…//状态计算 a[i]=min(a[i-1]+1,a[i-5]+1,a[i-11]+1);记忆化搜索方法#include<bits/stdc++.h>using namespace std;int a[20];int dp(int x){ if(x==100)原创 2021-04-20 20:18:56 · 379 阅读 · 0 评论 -
石子合并 区间dp
设有 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-04-17 14:36:10 · 85 阅读 · 0 评论 -
鸣人的影分身 反思
没啥说的 细节问题,这么简单的题错了一万次我草#include<bits/stdc++.h>using namespace std;int t,m,n,ans;set<string>a;int c[100],bb[100];void dfs(int u,int last){ //查克拉必须要用完hh,审题不清 if(u==n){ memcpy(bb,c,sizeof c);//没有备份,调试了一万年 sort(bb,bb+u);原创 2021-04-16 16:36:45 · 117 阅读 · 0 评论 -
糖果 Dp 取余Dp
由于在维护世界和平的事务中做出巨大贡献,Dzx被赠予糖果公司2010年5月23日当天无限量糖果免费优惠券。在这一天,Dzx可以从糖果公司的 N 件产品中任意选择若干件带回家享用。糖果公司的 N 件产品每件都包含数量不同的糖果。Dzx希望他选择的产品包含的糖果总数是 K 的整数倍,这样他才能平均地将糖果分给帮助他维护世界和平的伙伴们。当然,在满足这一条件的基础上,糖果总数越多越好。Dzx最多能带走多少糖果呢?注意:Dzx只能将糖果公司的产品整件带走。输入格式第一行包含两个整数 N 和 K。以转载 2021-04-16 14:04:06 · 246 阅读 · 0 评论 -
地宫取宝 搜索 dp
地宫取宝题目提交记录讨论题解视频讲解X 国王有一个地宫宝库,是 n×m 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。地宫的入口在左上角,出口在右下角。小明被带到地宫的入口,国王要求他只能向右或向下行走。走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。当小明走到出口时,如果他手中的宝贝恰好是 k 件,则这些宝贝就可以送给小明。请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这 k 件宝贝。输入格式.转载 2021-04-13 09:18:13 · 64 阅读 · 0 评论 -
最短编辑距离
最短编辑距离题目提交记录讨论题解视频讲解给定两个字符串 A 和 B,现在要将 A 经过若干操作变为 B,可进行的操作有:删除–将字符串 A 中的某个字符删除。插入–在字符串 A 的某个位置插入某个字符。替换–将字符串 A 中的某个字符替换为另一个字符。现在请你求出,将 A 变为 B 至少需要进行多少次操作。输入格式第一行包含整数 n,表示字符串 A 的长度。第二行包含一个长度为 n 的字符串 A。第三行包含整数 m,表示字符串 B 的长度。第四行包含一个长度为 m 的字符串.原创 2021-04-06 23:14:38 · 67 阅读 · 0 评论 -
背包问题 动态规划
背包问题核心优化一般就是优化状态转移方程01背包问题有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000原创 2021-03-31 17:27:26 · 6195 阅读 · 0 评论 -
数字三角形 动态规划 线性dp
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。 7 3 88 1 02 7 4 44 5 2 6 5输入格式第一行包含整数 n,表示数字三角形的层数。接下来 n 行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。输出格式输出一个整数,表示最大的路径数字和。数据范围1≤n≤500,−10000≤三角原创 2021-04-02 10:10:30 · 76 阅读 · 0 评论 -
最长上升子序列 动态规划
最长上升子序列题目提交记录讨论题解视频讲解给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数 N。第二行包含 N 个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000,−109≤数列中的数≤109输入样例:73 1 2 1 8 5 6输出样例:4动态规划的一个特点就是当前解可以由上一个阶段的解推出, 由此,把我们要求的问题简化成一个更小的子问题。子问题具有相同的求解方式,只不过是规模小了而已.原创 2021-04-01 20:17:12 · 139 阅读 · 0 评论