动态规划
文章平均质量分 65
动态规划相关概念及解题
疯疯癫癫才自由
这个作者很懒,什么都没留下…
展开
-
动态规划(AcWing): 1)计数类DP,2)树形DP,3)记忆化搜索,4)状态压缩DP,5)数位统计DP;
1)把最小值1去掉,选择的数目个数为i-1,和为j-1,dp[i][j] = dp[i-1][j-1];* dp[i-1][j] , dp[i][j-i] 一定先于 dp[i][j] 计算出来,因此我们就可以。* 又因为 dp[i][j-i] = dp[i-1][j-i] + dp[i-1][j-2*i] +* 状态转移方程:dp[i][j] = dp[i-1][j-1] + dp[i][j-i];+nk,其中 n1≥n2≥…原创 2022-09-30 15:05:45 · 444 阅读 · 0 评论 -
线性DP(898. 数字三角形,895. 最长上升子序列,897. 最长公共子序列,902. 最短编辑距离)
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。* 状态计算:dp[i][j] = max(dp[i-1][j]+a[i][j] , dp[i-1][j-1]+a[i][j] );* 状态表示:dp[i][j] : 由起点到a[i][j] 路径上的和的集合中的最大值;行,每行包含若干整数,其中第 i 行表示数字三角形第 i。输出一个整数,表示最大的路径数字和。,表示数字三角形的层数。原创 2022-09-22 21:40:06 · 302 阅读 · 0 评论 -
背包问题(01背包,完全背包,多重背包,用二进制优化的多重背包,分组背包)
又因为 dp[i][j-w[i]]=max(dp[i-1][j-w[i]] , dp[i-1][j-2*w[i]]+c[i]],* 状态转移方程:dp[i][j] = max(dp[i-1][j] , dp[i-1][j-w[i]] +c[i]);* 因为 dp[i][j] = max(dp[i-1][j] , dp[i-1][j-w[i]]+c[i] ,* 所以 dp[i][j] = max(dp[i-1][j],dp[i][j-w[i]]);,k件第i种物品的情况。原创 2022-09-19 19:21:05 · 430 阅读 · 0 评论 -
Preview(2021-2022年度第三届全国大学生算法设计与编程挑战赛(夏季赛)——正式赛——E)
Preview。1)二维数组设计动态规划: 状态设计:dp[i][j](i>=j)表示复习第i门课程,从第j天开始的总价值;j小于等于i是关键。 状态方程:dp[i][j]=max(dp[i+1][j],dp[i+1][i+a[i]+1]+a[i]*b[i]) (i>=j); 并且由于题目的设定,只能从后往前递推,因为选择了第i门课,那么第i天以后的a[i]天都不能 复习其他科目;如果从前往前递推,那么我选择了第i门课,那么选择第j门课的时候,要多少天以后我才能选择第j门课原创 2022-07-26 20:26:06 · 439 阅读 · 3 评论 -
PAT A1040 Longest Symmetric String
最长回文子串:求出开始位置到第i位的子串的hash值;然后就可以用求出的hash值进而求出子串的hash值;同时,还需要用到该字符串的反转序列的hash值;现在来分析一下原序列与反转序列的等价情况。eg:原序列: "abcbad"反转序列: "dabcba""bad"在原序列的下标是[3,5];在反转序列中相同序列是[2,0],即[6-1-3,6-1-5];所以原序列是str[i,j],则反转序列中相同序列是str[len-1-i,len-1-j](从后往前看)那么反转序列中相反序原创 2022-07-09 13:58:30 · 118 阅读 · 0 评论 -
2039: [蓝桥杯2022初赛] 李白打酒加强版 (动态规划)
分析:状态设计:dp[i][j][k]的值表示遇到i家店,j朵花,酒壶中还剩k斗酒的可能情况数; 状态转移方程:dp[i][j][k]=dp[i-1][j][k/2](i>1&&k%2==0) + dp[i][j-1][k+1](j>1); 边界设计:除了dp[0][0][2]=1,其他元素全为0; 他一共遇到店 N 次,遇到花 M 次。已知最后一次遇到的是花, 他正好把酒喝光了;所以 最后一次肯定遇到的是花,那么最后的结果便是dp[N][M-1][1]; 并且酒壶中原创 2022-07-05 16:20:14 · 2387 阅读 · 2 评论 -
购物单(算法课设题目)(动态规划,深度优先,背包问题)
* \ 小明的妈妈奖励他N元,小明开始做预算,给出m件物品的价格以及重要度, * \ 小明想在不超过N元的前提下,使得购买的物品的价格与重要度的乘积 * \ 的总和最大 * anaysis: 明显可以定义出一个结构体来存储每件商品的信息,然后就可以用深度优先搜索 算法进行选择 DFS 函数: DFS_select(int index,int sum_price,int sum_value);* \ 2)其实现在细细想来,这不就是属于背包问问原创 2022-07-05 11:41:49 · 572 阅读 · 0 评论 -
背包问题(01背包,完全背包,动态规划)
/**< 1th example: *//** \brief * 1th solution: * 一个商人带着一个能装m千克的背包去乡下收购货物, * \ 现有n种货源,且第i种货物有wi千克,可获利pi元, * \ 如何收购商品,才能使利润最大,注意此时每样物品只有一件 * \ 01背包问题 * \ analysis: * \ 状态设计:dp[i][v]表示前i件物品能够容纳在容量为v的背包里面,返回最大利润; * \ therefore,能得到dp的状态转移方程:dp[i原创 2022-07-04 14:42:24 · 145 阅读 · 0 评论 -
最长回文子串(动态规划)
最长回文子串: 状态设计:dp[i][j]表示str[i]到str[j]的字串是否为回文子串,是表示为1,不是表示为0; 状态转移方程:dp[i][j]=dp[i-1][j-1](str[i]==str[j]) = 0 (str[i]!=str[j]); 但此处又须注意,dp的值是以字符串的子串长度(1...len)进行递增枚举的, 而不是以字符下标i为基点,j=i+k(k=1...len),因为在算后面的dp[i][j]时,需要把dp[原创 2022-07-03 16:58:55 · 446 阅读 · 0 评论 -
最长公共子序列(LCS)(动态规划,递归)
1)从前往后递推:2)从后往前推; 状态设计:dp[i][j]表示两个序列从尾位置开始,第一个序列到i位置, 第二个到j位置的最长公共子序列; 状态转移方程:dp[i][j]=dp[i+1][j+1]+1 (str1[i]==str2[j]); || = max(dp[i+1][j],dp[i][j+1]) (str1[i]!=str2[j]); 最后可根据dp[i][j]的值输出最长公共子序列的内容,当dp[i][j]== (dp[i+1原创 2022-07-03 15:51:15 · 1052 阅读 · 0 评论 -
最长不下降子序列(LIS)(动态规划)
3)为了后续不下降子序列的内容进行输出,也可开一个result数组,result[i] 表示str[i]的前继结点,一个序列的首结点设置为-1,与其他节点进行区分, 其实和第一个程序利用dp的值进行输出内容是一样的。...原创 2022-07-03 14:53:10 · 601 阅读 · 0 评论 -
动态规划——相关概念,(数塔问题)
与动态规划有关的几个概念:给出一个经典问题——数塔问题:一共给出了几个程序,有直解输出结果的,还有给出最大值的路径的,也有递归求解的,还有递推求解的: 递归解决: 输出最大值的路径:三维数组存储数据,存储,中间处理,输出于一体...原创 2022-07-02 12:09:38 · 137 阅读 · 0 评论 -
最大连续子段和(动态规划,递归,递推)
状态设计:dp[i]表示以a[i]结尾的最大序列和 状态转移方程: dp[i]=max(a[i],dp[i-1]+a[i]);求序列的最大连续子段和,如果全为负数,则最大连续最大字段和为0 并且还要输出最大子段和的开始和结束下标二分法求解,具有重叠子问题,用递归则要中间进行一些处理操作。...原创 2022-07-02 23:57:32 · 914 阅读 · 0 评论