线性dp
文章平均质量分 59
seez
njfu
展开
-
【无标题】
一点做过的题原创 2022-01-27 13:50:43 · 66 阅读 · 0 评论 -
牛客寒假集训营1 C cpu(模拟,贪心,dp)
题意:每两个相邻语句需要相隔至少三个位置贪心一下,就是只要相隔3个位置,即j-i==4 就可以了同时在贪心一下,如果要假如空语句,只要对离当前寄存器最近的的寄存器增加空语句,再前面的寄存器就不用管了模拟:输入时记录下离当前寄存器最近的关联寄存器 模拟时找到该寄存器当前的位置 计算位置间隔,判断加多少空语句这里add==3-(p-j)4表示当前寄存器,3表示p所在位置,2表示目标寄存器需要加入的空语句==4-(p-j)-1==4-(3-2)-1#include <...原创 2022-01-25 22:42:32 · 176 阅读 · 2 评论 -
牛客寒假训练营1 K 冒险公社(线性dp)
先从样例模拟清楚题意:...最后模拟可以得到答案4题意:求前n个岛中最多的绿岛数,根据罗盘预测结果知道实际上绿岛数dp做法由于dp问题的使用条件是1.最优子结构 2.不具有后效性本题是一个线性递推的过程,存在最优子结构由于处于某一点时,当前的状态(什么颜色) 是会影响到后面两座岛屿的所以我们可以多开几维,因为颜色就只有三种,可以枚举出来最后的时间复杂度是O(n*3^4)原问题:考虑前n个岛屿后,最多的绿岛数子问题:考虑前i个岛屿,且i为...原创 2022-01-25 13:39:26 · 312 阅读 · 0 评论 -
315. 旅行(lcs,统计lcs个数并输出)
分析: 先求出lcs的长度 dfs处理两个子串,找出所有lcs方案并且输出 lcs的求法最大公共子序列问题_qq12323qweeqwe的博客-CSDN博客、状态计算:可以分为不重不漏的四个子集a[i]在,b[j]在 dp[i-1][j-1]+1 a[i]在,b[j]不在 dp[i][j-1] a[i]不在,b[j]在 dp[i-1][j] a[i]不在,b[j]不在 dp[i-1][j-1]寻找lcs方案:由于我们已经知道...原创 2022-01-20 22:36:14 · 363 阅读 · 0 评论 -
314. 低买 (lis,线性dp,统计lis个数)
#include <iostream>#include <algorithm>using namespace std;const int N = 5005;int a[N];int dp[N][5];int n;int check(){ for (int k = 4;k >= 1;k--) for (int i = 1;i <= n;i++) if (dp[i][k]) return k;}int get_ans(int x){.原创 2022-01-20 21:34:07 · 359 阅读 · 0 评论 -
313. 花店橱窗(lis,线性dp)
限制条件:花束摆放的标号必须严格上升 每个花放在不同瓶子会有不同的美观程度 必须放满所有种花分析解决动态规划问题的一个经典思考方法是:暴力怎么做?暴力问题自然是首先枚举第一个花放在哪里,然后第二个花放在哪里...以此类推,直到放完所有的花。时间复杂度为O(n!)我们可以发现,放每一朵花都存在一种递推关系,而且影响后面的花放置的因素只有当前的花的位置和当前是第几朵花。存在着重叠子问题,当前这个位置放过第i种花,那么我们就可以先记录下来...动态规划原问题:有n种花在m..原创 2022-01-20 20:06:39 · 341 阅读 · 0 评论 -
312. 乌龟棋(线性dp,填表法)
题目要求:使用完所有卡片后,最多能得到的分数条件:每张卡片只能用一次,且只有4种卡片,每种卡片最多40张 每次到一个新的格子上都可以获得上面的分数 使用完所有的卡片,恰好能够到达终点第一种状态划分:原问题:走到第n个格子用了m张卡片获得的最大分数子问题:走到第 i个格子用了k张第j种卡片获得的最大分数状态表示:dp[i][k][j]通过划分这个子问题,我们发现,如果采用这种状态定义的话,我们只知道当前第j种卡片用了几张,而不能知道其他卡片用了几张,不满足无后效性原则,当前决..原创 2022-01-20 12:33:24 · 325 阅读 · 0 评论 -
[NOIP2008]传球游戏(环,线性dp)
原问题:传了m次之后回到小蛮手里的方案数子问题:传了i次之后回到第j个人手里的方案数定义:dp[i][j],传了i次之后回到第j个人手里的方案数属性:count根据集合的划分,可以分为不重不漏的两个子集从左边传过来 dp[i-1][j-1] 从右边传过来 dp[i-1][j+1]边界:dp[0][j...]=0;初始化:dp[0][1]=1;#include <iostream>#include <algorithm>using...原创 2022-01-19 14:14:35 · 1823 阅读 · 0 评论 -
274. 移动服务(线性dp)
分析:L个位置,N个请求,让我们求最小花费影响花费因素:处理花费的服务员所在的位置限制条件过程中不能去其他的位置,只能去发生请求的位置 不允许两个员工在同一个位置划分依据:由于有3个服务员,对于每个请求来说,有三种情况服务员1去服务 服务员2去服务 服务员3去服务本题的数据范围是200,对于难做的问题,可以思考暴力枚举怎么做,然后再对枚举进行优化枚举:有N个请求,3种选择,分别枚举,有3^N种方案动态规划:有N个请求,每个请求时x,y,z的位置范围为[3,2..原创 2022-01-18 19:27:34 · 401 阅读 · 0 评论 -
273. 分级(线性dp,结论)
两个条件1.b数组内部非严格上升或非严格递减2.要求所有b[i]-a[i] 的绝对值之和性质:我们可以得出一个性质:对于最优解s而言,一定存在一种构造方案,使得b数组都是由A中元素构成的证明:1.证明b[i]只能在[A'[1],A'[i]]区间上取根据绝对值不等式(货仓选址),要使得绝对值最小,最好的方法就是取在区间中间,而由于A‘数组是A数组升序后的数组,B要在满足上升的同时,使得b[i]-A[i]最小,所以应在A'[1]~A'[i]区间上取2.证明b[i]只能取A..原创 2022-01-18 14:54:43 · 379 阅读 · 0 评论 -
271. 杨老师的照相排列(填表法,线性dp)
我们可以发现性质,1.从左到右身高递减,从上到下身高也是递减,同时编号越大的同学身高越高2.每排人数N1>=N2....分析如下以此类推,其实我们可以发现一个规律1.对于任意一排,我们都是从他最左边依次安排排列(不存在隔空安排)2.对于任意一列,他当前被安排的长度都是>=后面所有列被安排长度我们就可以得到如下的规律任意一个排列的轮廓都是1,2这两种轮廓...原创 2022-01-16 21:11:56 · 396 阅读 · 1 评论 -
272. 最长公共上升子序列(lcis,dp)
首先是lis的状态划分图然后是lcs结合lis和lcs两种dp问题的分析方法,我们就可以得出lcis的状态分析图1.首先上升子序列的分析方法:以某个数字为结尾2.其次公共子序列的分析方法:有4种状态 00,01,10,11!!!双关键字的问题一般都以“消元”掉某个关键字来进行降维处理状态表示集合:所有以a[1,i]和b[1,j]构成的且以b[j]为结尾的公共上升子序列属性:max状态计算(决策集合)不包含a[i]:那么这个集合的最大值=dp[i-1]...原创 2022-01-15 09:50:06 · 1333 阅读 · 1 评论 -
187. 导弹防御系统(lis+dfs)
注意每一套防御系统有两种选择1.严格单调上升2.严格单调下降我们发现数据范围很小,就可以使用枚举的思想,也就是对于一个系统要上升还是下降,都枚举一遍,取两个结果的最小值,所以使用dfs枚举的思想。dfs枚举有三个参数void dfs(int num,int un,int dn){//num当前导弹编号,un已配备的上升设备,dn已配备的下降设备 }注意!在这里寻找可以插入的元素中,其实是使用了一个贪心的思路以上升子序列为例就是找到能插入的元素中,..原创 2022-01-13 16:20:16 · 457 阅读 · 3 评论 -
1010. 拦截导弹(贪心+队列,lis)
题目分为两问 1.一套防御设备能够拦截的最大导弹数2.需要配备几个防御设备第一问比较简单,就是一个简单的求最长下降子序列(最长不上升子序列)第二问求最少防御设备数,要用最少的下降子序列对数组进行全覆盖,根据贪心+队列的思想,就是求最小队列数相似:P4447 [AHOI2018初中组]分组_qq12323qweeqwe的博客-CSDN博客贪心思路:贪心思想的证明1.贪心得到的队列数是否==最优解2.证明得到的队列==最优解队列 1.证明队列数...原创 2022-01-13 15:25:19 · 245 阅读 · 0 评论 -
1016. 最大上升子序列和
#include <iostream>#include <algorithm>using namespace std;const int N=1e3+10;int a[N];int dp[N];int main(){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int res=0; for(int i=1;i<...原创 2022-01-13 11:07:55 · 79 阅读 · 0 评论 -
1012. 友好城市(lis,转化模型)
由于每个城市都有且仅有一个友好城市,而且每个城市的友好城市还互不相同等价于:有 2k个城市 ,那么就有 k 对 友好城市原创 2022-01-13 11:00:46 · 292 阅读 · 0 评论 -
1014. 登山
本题和怪盗基德的滑翔翼类似,不过怪盗基德的滑翔翼是求左右两边的最大值,这里是取左右两边和的最大值从左走到第i点所需的步数是f[i] //包含第i点从右走到第i点所需的步数是g[i] //包含第i点由于都包含第i点,所以需要减一那么总共经历的山数=f[i]+g[i]-1#include <iostream>#include <algorithm>using namespace std;const int N=1e3...原创 2022-01-11 17:54:12 · 281 阅读 · 0 评论 -
1017. 怪盗基德的滑翔翼(LIS)
往左走 for(int i=1;i<=n;i++) { dp[i]=1; for(int j=1;j<i;j++) if(hh[j]<hh[i]) dp[i]=max(dp[i],dp[j]+1); res=max(res,dp[i]); }往右走for(int i=n;i...原创 2022-01-11 13:01:15 · 268 阅读 · 0 评论 -
902. 最短编辑距离
一共有三种操作1.删除 2.插入 3.改写假设当前状态为dp[i][j],各种操作对应的状态转移如下1.删除原创 2022-01-10 19:57:39 · 402 阅读 · 0 评论 -
编辑距离问题
11221原创 2021-11-14 22:17:26 · 376 阅读 · 0 评论 -
最大公共子序列问题
2. 最大公共子序列1.连续的情况下题目:给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度,要求重复子数组连续。#include <iostream>#include <algorithm>using namespace std;int a[1005];int b[1005];int dp[1005][1005]; //dp[i][j],a数组的前i个元素与b数组的前j个元素的最大公共子序列int main(){ in..原创 2021-11-14 22:23:14 · 163 阅读 · 0 评论 -
最长上升子序列问题
1.最长上升子序列1.不连续的情况最长上升子序列作为线性dp的模板题#include <iostream>#include <algorithm>#include <cstring>using namespace std;int s[1005];int dp[1005];/*最长上升子序列* 本题的dp思路是:第i个元素构成一个单调子序列时它前面的元素可能是来自前面任意一个元素* 或者前面没有一个元素是比他小的,他自己本身作为一.原创 2021-11-14 22:20:25 · 371 阅读 · 0 评论