随笔分类 -  线性dp

1
摘要:每日一题 day61 打卡 Analysis las数组表示的是最近一个为j的位置为是什么。 dp数组的含义是以str[i]为结尾的子序列数量。 于是有状态转移方程: dp[las[i][j]]+=dp[i]; 1 #include<iostream> 2 #include<cstdio> 3 #i 阅读全文
posted @ 2019-12-17 18:10 handsome_zyc 阅读(181) 评论(0) 推荐(0) 编辑
摘要:每日一题 day59 打卡 Analysis 很容易看出是一个dp, dp[i][j[k][0/1]来表示到了(i,j)时,刷了k次,0表示这个没刷,1表示刷了。 于是有转移: 1.换行时一定要重新刷 2.若这一格与前一个格子颜色一样,最优的方式是把前一个的1状态原封不动转移,这时的0状态也跟着原封 阅读全文
posted @ 2019-12-14 15:57 handsome_zyc 阅读(305) 评论(0) 推荐(0) 编辑
摘要:每日一题 day57 打卡 Analysis 对于这个问题,由于分成了两个子序列,我们不妨就是枚举一下可能出现的情况: 无非就这两种: 1.+++++0000+++++0000++++ 2.0000++++00000++++000000 0就表示选了这个数,+就表示不选这个数, 那我们正反先做一个普 阅读全文
posted @ 2019-12-11 17:49 handsome_zyc 阅读(369) 评论(0) 推荐(0) 编辑
摘要:每日一题 day56 打卡 Analysis 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序。 然后就是dp了: 首先,应该想到f[i][j][k]:前i个人,在1号窗口打饭总时间j,在2号窗口打饭总时间k 当然,这样会爆空间,所以想到去掉一维。 f[i] 阅读全文
posted @ 2019-12-11 17:43 handsome_zyc 阅读(180) 评论(0) 推荐(0) 编辑
摘要:每日一题 day40 打卡 Analysis 因为两个序列都是1~n 的全排列,那么两个序列元素互异且相同,也就是说只是位置不同罢了,那么我们通过一个book数组将A序列的数字在B序列中的位置表示出来 因为最长公共子序列是按位向后比对的,所以a序列每个元素在b序列中的位置如果递增,就说明b中的这个数 阅读全文
posted @ 2019-11-13 18:44 handsome_zyc 阅读(253) 评论(0) 推荐(0) 编辑
摘要:每日一题 day30 打卡 Analysis f[i][j][p][q]表示他们走到(i,j),且两人魔瓶内魔液量的差为p时的方法数。q=0表示最后一步是小a走的,q=1表示最后一步是uim走的。题目中说魔瓶的容量为k,实际上就是动归时p需要对k+1取余数,即p只有0~k,k+1种可能。答案为所有f 阅读全文
posted @ 2019-10-29 19:22 handsome_zyc 阅读(158) 评论(0) 推荐(0) 编辑
摘要:每日一题 day29 打卡 Analysis 朴素的DP方程为: dp[i]=max{sum[i]-sum[j-1]}; 对于每个i 需要用单调队列维护最小的sum[j-1] 注意: 1.tail初值要置成1,因为i=1时状态要从i=0转移,所以队列中已有一个元素0。 2.对于每个i,要先维护队头, 阅读全文
posted @ 2019-10-29 16:10 handsome_zyc 阅读(171) 评论(0) 推荐(0) 编辑
摘要:Analysis ①首先将所有粉刷匠,按照必须刷的小木块Si从小到大排序. 上面这个操作为了保证我们可以顺序处理. ②我们可以设f[i][j]表示为,前i个粉刷匠,刷了前i个木块.可以有些木块选择不刷 状态确定好了后,我们分两种情况讨论. 第i个粉刷匠不工作,那么f[i][j]=f[i−1][j]第 阅读全文
posted @ 2019-10-26 11:14 handsome_zyc 阅读(184) 评论(0) 推荐(0) 编辑
摘要:Analysis 首先假设一天的第N小时与后一天的第一个小时不相连, 这种情况下DP转移比较好想 dp[i][j][0/1]dp[i][j][0/1]表示 考虑一天的前i个小时,已经休息了j小时,且第i个小时是否在休息 那么有状态转移方程: dp[i][j][0]=max(dp[i-1][j][0] 阅读全文
posted @ 2019-10-10 18:37 handsome_zyc 阅读(176) 评论(0) 推荐(0) 编辑
摘要:每日一题 day25 打卡 Analysis dp[i][j]=dp[i-1][j-1]*(i-j)+dp[i-1][j]*(j+1); 其中i和j是表示前i个数中有j个小于号,j<=i-1 要在长度为i的数列中插入一个数,那么共有i+1个位置可以插入(第一个位置最后一个位置和中间的i-1个位置)。 阅读全文
posted @ 2019-10-08 19:58 handsome_zyc 阅读(182) 评论(0) 推荐(0) 编辑
摘要:Analysis 给定一个f*v的矩阵 要求从第一行走到第f行,每行取走一个数, 且该行所取的数必须必上一行所取的数的列数大 , 求所能取走的最大值 注意每一行所取走的数字的列数必须大于等该行的行号 因为必须给前面的花留下足够的花瓶 同理每一行所能取的最大的花瓶号必须小于等于v-(f-该行行数) 由 阅读全文
posted @ 2019-10-06 14:07 handsome_zyc 阅读(239) 评论(0) 推荐(0) 编辑
摘要:每日一题 day24 打卡 Analysis 字符串+dp 仔细观察发现,对于f[i][j],它的值为以下三个值中的最小者: 除此之外,只需注意初始化即可。 请各位大佬斧正(反正我不认识斧正是什么意思) 阅读全文
posted @ 2019-10-02 20:37 handsome_zyc 阅读(203) 评论(0) 推荐(0) 编辑
摘要:每日一题 day23 打卡 Analysis dp[i][j]表示序列A中前i个与序列B中前j个匹配的相似度最大值 所以,dp方程很容易想到: 1.让a[i]与b[j]匹配 2.让a[i]与B序列中一个空位匹配 3.让b[j]与A序列中一个空位匹配 dp[i][j]=max(dp[i][j],dp[ 阅读全文
posted @ 2019-09-30 22:07 handsome_zyc 阅读(219) 评论(0) 推荐(0) 编辑
摘要:最长不下降子序列实现: 利用序列的单调性。 对于任意一个单调序列,如 1 2 3 4 5(是单增的),若这时向序列尾部增添一个数 x,我们只会在意 x 和 5 的大小,若 x>5,增添成功,反之则失败。由于普通代码是从头开始比较,而 x 和 1,2,3,4 的大小比较是没有用处的,这种操作只会造成时 阅读全文
posted @ 2019-09-29 18:49 handsome_zyc 阅读(552) 评论(0) 推荐(0) 编辑
摘要:每日一题 day21 打卡 Analysis DP的状态为已经完成的请求数量,通过指派一位服务员可以把”完成i - 1个请求的状态”转移到”完成i个请求的状态”那么我们可以知道转移从dp[i - 1] -> dp[i]dp[i][x][y][z] 代表为第i次选择的情况下,对应的1,2,3号服务员所 阅读全文
posted @ 2019-09-25 19:31 handsome_zyc 阅读(201) 评论(0) 推荐(0) 编辑
摘要:每日一题 day20 打卡 Analysis 线型动态规划 读入每个人的贪婪度之后,对其按照从大到小的顺序排序,定义状态f[i][j]为前i个人(排序后)分j个饼干的答案,那么答案为f[n][m],考虑状态转移方程。 1、若给第i个人的饼干数大于1 ,那么我们将这i个人的饼干数都减1(总共减n),他 阅读全文
posted @ 2019-09-25 19:24 handsome_zyc 阅读(245) 评论(0) 推荐(0) 编辑
摘要:每日一题 day16 打卡 Analysis 设F[i,j]表示A[1..i]与B[1..j]并且以B[j]结尾的两段最长公共上升子序列,那么我们可以发现这样的转移 (1)A[i]==B[j]时 F[i][j]=max(F[i-1][k])+1,其中k满足1<=k<=j并且B[j]<A[i]. (2 阅读全文
posted @ 2019-09-18 19:18 handsome_zyc 阅读(229) 评论(0) 推荐(0) 编辑
摘要:每日一题 day14 打卡 Analysis 五维dpf[a1,a2,a3,a4,a5]表示各排从左端起分别占了a1,a2,a3,a4,a5个人时合影方案数量然后我们枚举a1,a2,a3,a4,a5从0开始到N1,N2……N5若a1 < N1若a2 < N2&a1 > a2若a3 < N3&a2 > 阅读全文
posted @ 2019-09-17 19:52 handsome_zyc 阅读(254) 评论(0) 推荐(0) 编辑
摘要:每日一题 day12 打卡 Analysis 完全背包 请各位大佬斧正(反正我不认识斧正是什么意思) 阅读全文
posted @ 2019-09-14 16:55 handsome_zyc 阅读(210) 评论(0) 推荐(0) 编辑
摘要:这道题其实是一道01背包的变形题,主要思路如下:在不把剩余时间用光的前提下(剩余时间>0),尽可能的多唱歌。于是我们可以用dp[i]表示的是到当前i秒时,最多可以唱多少歌。 状态转换方程:dp[k]=max(dp[k],dp[k-yy]+1);最后输出可以唱多少歌。 阅读全文
posted @ 2019-07-24 13:11 handsome_zyc 阅读(215) 评论(0) 推荐(0) 编辑

1
点击右上角即可分享
微信分享提示