![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
从零开始的动态规划qwq
dp
化身孤岛的鲸o
我祈祷拥有一颗透明的心灵
展开
-
PIPIOJ 1112: 回文串 求回文子串的个数
题目:http://39.106.164.46/problem.php?id=1112代码如下:#include<iostream>#include<algorithm>#include<stdio.h>#include<cmath>#include<queue>#include<cstring>#include<vector>#include<stack>#include<map&g原创 2020-10-14 10:18:25 · 186 阅读 · 0 评论 -
PIPIOJ 1088: 回文串询问Ⅱ 区间回文子串的个数
题目:http://39.106.164.46/problem.php?id=1088代码如下:#include<iostream>#include<algorithm>#include<stdio.h>#include<cmath>#include<queue>#include<cstring>#include<vector>#include<stack>#include<map&g原创 2020-10-13 20:06:50 · 414 阅读 · 0 评论 -
PIPIOJ 1092: 地头蛇PIPI 动态规划
题目:http://39.106.164.46/problem.php?id=1092思路:题目中dp总共有四个状态,前面一家店选或不选,后面一家店选或不选,这里直接用四个变量代替,初始化第一个状态last_do等于第一个输入的值,然后从第二家店开始遍历。代码如下:#include<iostream>#include<algorithm>#include<stdio.h>#include<cmath>#include<queue>原创 2020-10-13 17:10:51 · 119 阅读 · 0 评论 -
PIPIOJ 1071: 数塔 动态规划
题目:http://39.106.164.46/problem.php?id=1071转移方程:dp[i][j]=mp[i][j]+max(dp[i+1][j],dp[i+1][j+1])代码如下:#include<iostream>#include<algorithm>#include<stdio.h>#include<cmath>#include<queue>#include<cstring>#include&原创 2020-10-13 01:22:48 · 107 阅读 · 0 评论 -
PIPIOJ 1191: PIPI奇遇记 环形最长连续子序列和
题目:http://39.106.164.46/problem.php?id=1191思路:连续的子序列最大值,当不成环的时候,取得最大值的时候可能在中间的连续部分,在当成环之后,就多了一种在两端的可能,那么这种连续子序列的最大值求法就可以用总和减去中间最小的连续子序列的和sum - minl,再与最大连续子序列和maxl两者之中取更大的一个即可。代码如下:#include<iostream>#include<algorithm>#include<stdio.h&原创 2020-09-25 01:21:40 · 210 阅读 · 0 评论 -
牛客网编程题 回文字符串 最长不连续回文子串 dp
牛客网编程题 回文字符串 最长不连续回文子串 dp题解:使用动态规划的思想,d[i][j]表示字符串s中位置i到位置j(j>i)的字符串中的最长的回文长度(1)当s[i]==s[j]时,d[i][j]的最长回文字符串长度为其子串d[i+1][j-1]的长度+2(2)当s[i]!=s[j]时,d[i][j]的最长回文字符串长度为d[i][j-1]和d[i+1][j]两个中的最大值最后...原创 2020-02-15 17:59:05 · 358 阅读 · 0 评论 -
牛客网编程题 善变的同伴 最大m段子段和+优化
牛客网编程题 善变的同伴 最大m段子段和+优化题解:题目要求要我们求最大m段子段和,但是这道题直接dp的话是只能通过80%的。因此我们要进行一些优化,也就是预处理。7 21 2 3 -2 3 -10 3(1)遇到连续的正数,我们可以把它们合并成为一个数。(2)遇到连续的负数,我们也可以把它们合并成为一个数。比如上面的这段序列,优化后为:6 -2 3-10 3这样的话,原本我们...原创 2020-02-15 17:01:34 · 257 阅读 · 0 评论 -
最长不下降子序列
什么是最大不下降子序列?给出一系列的数,在这个序列中求一个子序列,这个子序列是递增的(可以相等)。其中最长的子序列就是最长不下降子序列。例如下面的序列:2 2 4 1 5 5 6 3 1 1 5 6最大不下降子序列为:2 2 5 5 6 6其长度为6动态规划(DP)求最大不下降子序列:#include<iostream>#include<math.h>...原创 2019-07-25 22:48:22 · 178 阅读 · 0 评论 -
HDU 1024 Max Sum Plus Plus 最大m段子段和 dp
HDU 1024 Max Sum Plus Plus 最大m段子段和 dp题解:给出n个数,求m段子段和的最大值。这种问题是比较经典的dp问题:给定由n个整数(可能为负)组成的序列a1、a2、a3…,an,以及一个正整数m,要求确定序列的m个不相交子段,使这m个子段的总和最大需要注意的是:有些题目可能不存在负数答案,给出的序列全是负数,那么不管m是多少,答案是0。此时选择的子段是0个...原创 2020-02-15 16:27:52 · 201 阅读 · 0 评论 -
洛谷 P1095 守望者的逃离 dp
洛谷 P1095 守望者的逃离 dp题解:定义一个dp数组,dp[i]表示i秒可以行进的最大距离。我们把闪烁和跑步分开进行处理。代码如下:#include<iostream>#include<algorithm>#include<stdio.h>#include<cmath>#include<queue>#includ...原创 2020-02-25 20:42:16 · 174 阅读 · 0 评论 -
洛谷 P1063 能量项链 区间dp
洛谷 P1063 能量项链 区间dp题解:用dp[l][r]表示以dp[l]开头dp[r]结尾的数串的最大和,如k为i,j之间任一节点,有:dp[l][r] = max(dp[l][r], dp[l][k] + dp[k][r] + a[l] * a[k] * a[r])在环形问题中,可以将n个元素复制一遍,变成2*n个元素,简化代码。代码如下:#include<iostream...原创 2020-02-10 22:15:54 · 216 阅读 · 0 评论 -
洛谷 P1026 统计单词个数 dp
洛谷 P1026 统计单词个数 题解:dp[i][j]表示到了第i个位置,分了j块,能得到的最多的单词数。sum[i][j] 是预处理的表示从i到j的单词数。转移方程:dp[i][j] = max{ dp[i][j],dp[r][j-1]+sum[r+1][i] }这里的r表示前1~r个字符被分成j-1份,第r+1到第i个字母单独为1份,加起来就是分成了j份,r是需要被枚举的代码如下...原创 2020-02-10 00:11:38 · 180 阅读 · 0 评论 -
洛谷 P1541 乌龟棋 多维动态规划
洛谷 P1541 乌龟棋 多维动态规划题解:dp[a][b][c][d]:表示你出了a张爬行牌1,b张爬行牌2,c张爬行牌3,d张爬行牌4时的得分sum[x]:表示牌x一共有多少张起始状态dp[0][0][0][0]=num[1],即不出任何爬行卡之后对于每一张卡片,我们都可以选择放与不放,比较卡一的放与不放,只需决策卡一的放与不放,即取dp[a][b][c][d],dp[a-1][b...原创 2020-02-09 22:28:10 · 149 阅读 · 0 评论 -
洛谷 P1736 创意吃鱼法 前缀和+二维dp
洛谷 P1736 创意吃鱼法 前缀和+二维dp题解:这道题和P1387 最大正方形很像。首先,正方形有两条对角线,所以我们需要dp两次取最大值。我们使用s1[i][j]记录左边(或右边)连续的0的最大个数,s2[i][j]记录上边(或下边)连续的0的最大个数所以可以写出状态转移方程:从左上到右下: dp[i][j]=min(dp[i][j],min(s1[i-1][j],s2[i]...原创 2020-02-06 20:08:10 · 177 阅读 · 0 评论 -
洛谷 P1855 榨取kkksc03 多维背包问题
洛谷 P1855 榨取kkksc03 多维背包问题题解:其实就是多维的01背包问题。代码如下:#include<iostream>#include<algorithm>#include<stdio.h>#include<cmath>#include<queue>#include<cstring>#inclu...原创 2020-02-06 18:24:17 · 198 阅读 · 0 评论 -
洛谷 P1417 烹调方案 排序+01背包
洛谷 P1417 烹调方案 排序+01背包题解:现在考虑相邻的两个物品x,y。假设现在已经耗费p的时间:那么首先装物品x所获得的价值为:a[x]-(p+c[x])*b[x]+a[y]-(p+c[x]+c[y])*b[y] ①那么首先装物品y所获得的价值为:a[y]-(p+c[y])*b[y]+a[x]-(p+c[y]+c[x])*b[x] ②对这两个式子化简,得到①>②的条件是c[x...原创 2020-02-06 17:33:21 · 162 阅读 · 0 评论 -
洛谷 P1387 最大正方形 二维dp
洛谷 P1387 最大正方形 二维dp题解:二维数组dp[i][j]表示以i,j为右下角的正方形的最大边长很容易写出动态转移方程:if(a[i][j]==1){ dp[i][j]=min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1]))+1;}代码如下:#include<iostream>#include<algorith...原创 2020-02-06 15:20:52 · 183 阅读 · 0 评论 -
洛谷 P1006 传纸条 三维dp
洛谷 P1006 传纸条 三维dp代码如下:题解:因为是从上方和从下方传纸条,也就相当于从左上角连续传两张纸条,路径不重复,效果相同。从左上来看的话就只能向右或向下传纸条。那么两张纸条在过程中就一定在一条斜线上,而在一条斜线上纵坐标与横坐标相加相等。我们需要一个三维dp数组:第一维度维护的是在传的过程中纵坐标与横坐标的和。在同一斜线上,剩下表示两个点的纵坐标就可以表示这两个点的位置...原创 2020-02-05 18:37:27 · 236 阅读 · 0 评论 -
洛谷 P1508 Likecloud-吃、吃、吃 二维dp
洛谷 P1508 Likecloud-吃、吃、吃 二维dp题解:从最后一行开始向上进行dp,每次更新的是当前行的前一行。代码如下:#include<iostream>#include<algorithm>#include<stdio.h>#include<cmath>#include<queue>#include<...原创 2020-02-05 14:19:45 · 190 阅读 · 0 评论 -
洛谷 P1441 砝码称重 dfs+动态规划
洛谷 P1441 砝码称重 dfs+动态规划题解:我们首先进行dfs,记录深度depth和当前已经舍弃的砝码数目num,当深度到达n时,说明已经全部搜索到了,若此时num==m,我们就进行一次dp,计算出这时最多可以称出的不同重量,最后取最大值即可。至于dp的过程,我们可以采用逆推的方式,dp[j]=1说明重量为j的物品可以被称出。代码如下:#include<iostream>...原创 2020-02-01 15:32:27 · 394 阅读 · 0 评论 -
洛谷P1057 传球游戏 简单的递推
Solution:这是一道可以用递推来解决的题目。每个人拿到的球可以来自左边的一个人也可以来自右边一个人。于是我们用dp[i][m]表示经过m次传导传到编号为i的人手中。于是可以写出递推式:dp[i][m]=dp[i-1][m-1]+dp[i+1][m-1]当i=1和i=n时,需要特殊处理。边界条件:dp[1][0]=1(经过0次传导的方法数为1)代码如下:#include<...原创 2019-04-10 14:17:42 · 233 阅读 · 0 评论 -
洛谷 P1216 数字三角形 简单的递推
Solution:这道题的意思让我们从三角形金字塔的最高点开始找到一条到最底端最短的路径。看到这道题,可能很多人都会想从最高点开始用贪心,但是你会发现,用贪心找到的并不是最长的路径。因为贪心只能从现在的点向下取其左右相邻点的最大值,而不能保证取到下一层的最大值,所以不能找到一条最长的路径。所以我们要使用递推,从最底层向上递推。#include<iostream>#inc...原创 2019-04-14 21:01:27 · 354 阅读 · 0 评论 -
洛谷P1025 数的划分——简单的递推
Solution:这道题主要是递推的思想。题目要求把数n分成k份,我们先考虑特殊情况,显然n<k时,method[n][k]=0; n=k时,method[n][k]=1。剩下的情况:1、分出的k份中含有1:method[n][k]=method[n-1][k-1]2、分出的k份中不含有1:method[n][k]=method[n-1][k-1]+method[n-k...原创 2019-04-08 23:59:40 · 289 阅读 · 0 评论 -
洛谷P1192 台阶问题——简单的递推
Solution:这是一道简单的递推题目,每一节台阶都要从前面的台阶上来,因为每次可以上1~k阶台阶,所以我们假设要上第n阶台阶(n>=k),那么就可以从第0~n-k阶台阶上来。于是可以写出递推式steps[n]=steps[n]+steps[n-k]。代码如下:#include<iostream>#define MAX 100005using namespace ...原创 2019-04-08 18:01:06 · 767 阅读 · 1 评论 -
洛谷 P1115 最大子段和 dp
洛谷 P1115 最大子段和 dp题解:比较简单的动态规划题目。代码如下:#include<iostream>#include<algorithm>#include<stdio.h>#include<cmath>#include<queue>#include<cstring>#include<vect...原创 2020-02-03 21:04:30 · 174 阅读 · 0 评论 -
洛谷 P1233 木棍加工 贪心+最长上升子序列+dilworth定理
洛谷 P1233 木棍加工 贪心+最长上升子序列+dilworth定理题解:(1)我们先对木棍按照长度或者宽度从大到小排序(2)假设我们按长度进行排序,那么我们就在宽度序列中求最长上升子序列的长度即可。为什么最长上升子序列的长度就是答案呢?因为题目中要求我们求的是在宽度序列中最长不上升子序列的个数,根据dilworth定理,最长不上升子序列的个数=最长上升子序列的长度,可以自己动手模拟一...原创 2020-02-03 19:04:49 · 274 阅读 · 0 评论 -
洛谷 P1439 【模板】最长公共子序列(LCS)
洛谷 P1439 【模板】最长公共子序列解析:我们可以用dp[i][j]来表示第一个串的前i位,第二个串的前j位的LCS的长度,那么我们是很容易想到状态转移方程的:(1)如果当前的a[ i ]和b[ j ]相同(即是有新的公共元素) 那么 dp[ i ] [ j ] = max(dp[ i ] [ j ], dp[ i-1 ] [ j-1 ] + 1);(2)如果不相同,即无法更新公共元素...原创 2020-02-03 17:19:05 · 207 阅读 · 0 评论 -
洛谷 P1313 计算系数 dp计算多项式系数
洛谷 P1313 计算系数 dp计算多项式系数思路:f [i][j]表示xiyj的系数,(默认k=i+j),可以得到转移方程:f[i][j]=f[i-1][j]*a+f[i][j-1]*b代码如下:#include<iostream>#include<algorithm>#include<stdio.h>#include<cmath>...原创 2020-01-09 20:24:02 · 266 阅读 · 0 评论 -
洛谷 P1140 相似基因 dp打表
https://www.luogu.org/problem/P1140思路:记第一个字符串s1的长度为len1,第二个字符串s2的长度为len2定义一个二维数组dp[len1][len2]存储当前的最大相似度dp[i][j]是将s1的前i个字符和s2的前j个字符匹配得到的最大相似度每次处理一个字符时,有三种选择:(1)在s1中插入一个空字符(2)在s2中插入一个空字符(3)将s...原创 2019-10-23 19:22:19 · 176 阅读 · 0 评论 -
洛谷 P1880 石子合并 区间dp
https://www.luogu.org/problem/P1880思路:区间dp的经典题目。一、什么是区间dp?求解在一个区间上的最优解,那么把这个区间分割成一个个小区间,求解每个小区间的最优解,再合并小区间得到大区间即可。二、对于这道题而言,我们假设区间是i~j,那么我们枚举 i-j区间上的点k,可以得到状态转移方程:dp[i][j]=max(dp[i][j],dp[i][k]+...原创 2019-10-23 16:55:39 · 269 阅读 · 0 评论 -
洛谷 P1280 尼克的任务 线性dp
https://www.luogu.org/problem/P1280思路:这道题要我们求出能获得的最大时间,显然是一个线性dp问题。很容易想到用一个数组dp[i]表示从第i分钟到第n分钟可以获得的最大空闲时间。如果我们i正序从1~n,因为后面任务获得的空闲时间必然会影响前面所获得的空闲时间,所以正序必然是不可行的。我们再考虑倒序,也就是i从n~1,这样的话我们也要将任务按照开始时间...原创 2019-10-23 15:52:51 · 176 阅读 · 0 评论 -
洛谷 P1091 合唱队形 最长上升子序列+枚举
https://www.luogu.org/problem/P1091思路:这道题的数据比较小,所有我们可以枚举中间人i的位置,在左边求出最长上升子序列,在右边求出最长下降子序列,再进行求和得到最大的maxl。最后要去掉的人就是n-maxl。代码如下:#include<iostream>#include<stdio.h>#include<math.h&g...原创 2019-10-23 14:58:02 · 160 阅读 · 0 评论 -
洛谷 P1020 导弹拦截 最长不上升子序列(模板)
https://www.luogu.org/problem/P1020思路:这道题,其实要求的就是最长不上升子序列的长度以及最长上升子序列的长度。这个问题确定挺经典的。从头开始讲吧。一、lower_bound和upper_bound先了解一下STL中的这两个函数的作用。假设我们在一个有序数组a中查找元素x,那么:(1)lower_bound会找出序列中第一个大于等于x的数(2)u...原创 2019-10-22 17:51:49 · 315 阅读 · 0 评论 -
PAT甲级 1040 Longest Symmetric String 最长回文子串 动态规划或者暴力
Solution:找字符串中的最长对称字符子串。易忽略偶数对称情况,例如样例是"abccba"或者"abcdcba"的情况。所以分两次遍历,一次是奇数对称情况,一次是偶数对称情况。代码如下:#include<iostream>#include<string>using namespace std;int main(){ string s; ...原创 2019-08-31 16:15:38 · 211 阅读 · 0 评论 -
PAT甲级 1007 Maximum Subsequence Sum 最大连续子序列和 dp或者暴力枚举
Solution:这道题是求一个数组的最大子数组的和。暴力枚举就行了。代码如下:#include<iostream>using namespace std;int a[10005];int main(){ int n; cin>>n; for(int i=0;i<n;i++){//读入a[]数组 cin>>a[i]; } i...原创 2019-07-14 23:22:03 · 214 阅读 · 0 评论 -
PAT甲级 1045 Favorite Color Stripe 最长不下降子序列(LIS)或者最长公共子序列(LCS)
Solution:题目大意:给出m中颜色作为喜欢的颜色(同时也给出顺序),然后给出一串长度为L的颜色序列,现在要去掉这个序列中的不喜欢的颜色,然后求剩下序列的一个子序列,使得这个子序列表示的颜色顺序符合自己喜欢的颜色的顺序,不一定要所有喜欢的颜色都出现。分析:因为喜欢的颜色是不重复的,把喜欢的颜色的序列依次存储到数组中,pos[i] = j表示i颜色的下标为j。先在输入的时候剔除不在喜欢...原创 2019-07-25 22:51:55 · 231 阅读 · 0 评论