
DP
nbl97
这个作者很懒,什么都没留下…
展开
-
uva1625 Color Length
题目:有两个颜色序列,现按照“每次可以把一个序列开头的颜色放到新序列尾部”的顺序合并成一个序列。对于每个颜色 c 而言,L(c) 等于最大位置和最小位置之差。找出一种方式使得所有 L(c) 的总和最小。分析:这道题最困难的地方就在于 L(c) 的计算,无法在 DP 的过程中很好的计算出 L(c) 。所以,我们只能在指标函数的计算方式上想办法,我们不等某个颜色全转移完后算它的 L(c) ,而是每次累加原创 2017-08-18 01:26:37 · 207 阅读 · 0 评论 -
背包路径记录方法总结
0-1背包记录路径:不要求字典序:法一:逆推状态,看这个状态是由哪个状态推过来的,从而找到上一个状态即可。可用额外的标记数组,也可不标记直接用f[][]数组求解。此时如果f数组被滚动优化成了一维,就无法倒推了。for(int i=1;i<=n;i++){ for(int j=V;j>=0;j--){ f[i][j] = f[i-1][j]; if(j < c[...原创 2018-11-01 17:14:54 · 1155 阅读 · 2 评论 -
2017acm香港区域赛 Optimal Coin Change(完全背包+记录路径)
题目:用几种面额的钱凑一个面额,问最少需要多少枚硬币。数量相同时尽量使用小面额,输出每个硬币用多少枚。输入的硬币已经按面额小到大排好序。分析:完全背包+路径输出。因为要尽可能使用小面额的硬币,所以在转移的时候:如果 f[j-a[i]] + 1 < f[j],肯定是要转移,记录状态j用的i硬币转移来的。如果 f[j-a[i]] + 1 = f[j],也要转移,因为f[j]不变的情...原创 2018-10-31 19:55:45 · 354 阅读 · 0 评论 -
hdu6477 YJJ's Salesman (线段树+dp)
题目:一个人从(0,0)走到(10^9,10^9),每次只能往右、上、右上走一个单位。 在地图上,有n个村庄,每个村庄有一个收获值,只有当从左下方走到某个点的时候,这个点的收获值才能被获取。给出n个村庄的坐标和每个村庄的收获值,问最大的收获值和是多少。 (1≤N≤105)分析:用线段树根据y轴维护收获值和。 对y离散化,然后对所有村庄按照x从小到大,y从大到小的顺序排序。对于第i...原创 2018-08-26 00:48:08 · 444 阅读 · 0 评论 -
hdu1087 Super Jumping! Jumping! Jumping!(线段树+DP)
题目:求一个数列的最长上升子序列和。(1≤n≤105,ai是32位整数)(1≤n≤105,ai是32位整数)(1 \leq n \leq 10^5, a_i是32位整数)分析:其实这个题的数据没有那么大,n^2的算法也可以过,在此提供一种O(nlogn)的做法。转移方程是dp[i] = max(dp[j]) + a[i], (1<= j < i, a[j] < ...原创 2018-08-26 00:23:28 · 158 阅读 · 0 评论 -
计蒜客2018蓝桥A模拟赛(三)蒜头君的01串
题目:蒜头君想知道长度为50且连续的1和连续的0的个数都不超过10的01串有多少个。分析:用dp[i][j][k] 表示长度为i 最后一位为j 这一位已经出现了k次 的数有多少。 转移时,最后一位只出现1次的可由最后一位是另一个数的所有情况得到,而出现超过 k 次的可由之前结尾是一样的数且出现 k - 1次的转移得到。代码:#include <bits/stdc++.h>using name原创 2018-04-27 19:38:34 · 236 阅读 · 0 评论 -
2018计蒜客蓝桥杯A组模拟(三) 蒜头君的数字
题目:有n个数,每次从左边或右边取一个,直到取完。每取一个数会有一个分数,问总分最大是多少? 分数计算如下:第一次拿的分数是数字本身。随后每次得到的分数是这个数与之前已取数的极差的乘积。分析:动态规划问题,我们可以用dp[i][j]表示剩余序列为第 i 个数到第 j 个数时已经获得的最大分数,可以通过 dp[i−1][j] 和 dp[i][j+1] 转移过来,需要注意边界情况,同时我们需要维原创 2018-04-30 13:31:06 · 518 阅读 · 0 评论 -
hdu5898 odd-even number (数位DP)
题目:给出 [L, R] ,求出这个区间内有多少个数满足:按数位看,连续的奇数有偶数个,连续的偶数有奇数个。分析:典型的数位DP。 用 dp[pos][pre][jo] 表示后pos位,pre=0表示前一位是偶数,pre=1表示前一位是奇数,jo=0表示连续的与前一位同奇偶性的有偶数个,jo=1表示奇数个。 这道题更熟悉了数位DP的用法。数位DP其实就是用参数记录下来之前的状态,然后对当前位进行原创 2017-10-19 00:25:38 · 285 阅读 · 0 评论 -
2017百度之星资格赛1003 度度熊与邪恶大魔王(完全背包)
题意:度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来。邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力。度度熊一共拥有m种攻击方式,第i种攻击方式,需要消耗k[i]的晶石,造成p[i]点伤害。当然,如果度度熊使用第i个技能打在第j个怪兽上面的话,会使得第j个怪兽的生命值减少p[i]-b[j],当然如果伤害小于防御,那么攻击就不会奏效。如果怪兽的生命值降为0或以下,那么原创 2017-08-05 18:50:58 · 585 阅读 · 1 评论 -
2017百度之星资格赛 hdu6083 度度熊的午饭时光 (01背包+字典序路径)
题意:度度熊最期待每天的午饭时光,因为早饭菜品清淡,晚饭减肥不敢吃太多(胖纸的忧伤T.T)。百度食堂的午餐超级丰富,祖国各大菜系应有尽有,度度熊在每个窗口都有爱吃的菜品,而且他还为喜爱的菜品打了分,吃货的情怀呀(>.<)。但是,好吃的饭菜总是很贵,每天的午饭预算有限,请帮度度熊算一算,怎样打饭才能买到的最好吃的饭菜?(不超过预算、不重样、午餐等分最高的情况下,选择菜品序号加和最小,加和相等时字典序最原创 2017-08-07 18:20:55 · 805 阅读 · 0 评论 -
hdu6092 Rikka with Subset (反向背包)
题意:有一个 nn 个正数的序列 AA,和为 mm 。现给出这个序列所有的子集和的出现次数(共2n2^n个子集,但不同子集的和可能会相同),B[i]B[i] 表示有 B[i]B[i] 个子集的和是 ii 。 求出序列 A 。分析:这道题可以正着推也可以倒着推。正着推:所谓正着推,就是一步步模拟出来 BB。何为一步步模拟?BB 的含义其实是,前 nn 个元素的所有子集的和的出现的次数。就像背包问题中原创 2017-08-10 02:25:24 · 429 阅读 · 0 评论 -
hdu5534 Partial Tree (巧妙转为完全背包)
题目:一个树由 n 个点 n-1 条边构成,已知度数为 i 的点的权值是 f(i)。问,这棵树最大权值是多少。分析:很好的一道题。 一开始整个队伍一直在想贪心,如何往里一条一条加边使得符合要求。后来又想“如何将一个有k条边的满足要求的变成一个k+1边的”,看似正确,其实并没有最优子结构。其实这时就应该果断放弃贪心的想法,去从别的角度入手。可惜能力不够眼界不宽。这道题需要猜一个小结论:一个树总度数肯原创 2017-10-03 20:37:10 · 499 阅读 · 0 评论 -
hdu6078 Wavel Sequence(分析优化递推过程,好题)
题意:序列a有n个数,序列b有m个数。问,两个序列有多少个公共子序列满足“波浪状”。“波浪状”数组形如 a1 < a2 > a3 < a4 > a5 ……1 <= n,m <= 2000分析:看了一个博客分析的非常好 http://blog.youkuaiyun.com/weyoungg/article/details/76735843代码就是按照这个博主的思路,只不过用滚动数组把第一维滚掉了。代码:#inc原创 2017-08-14 00:47:05 · 214 阅读 · 0 评论 -
整数划分问题
将 nn 划分成若干正整数和思路一:用 f[i][j]f[i][j] 表示将 ii 分成 jj 个数字的方案数。将 ii 的划分按“含不含 11” 来分成两部分。很容易可以想到,在 i−1i - 1的所有划分上添加个 11,就得到了 ii 含 11 的划分。所以,方程为:f[i][j]=f[i−1][j−1]+f[i−j][j]f[i][j] = f[i-1][j-1] + f[i-j][j]这原创 2017-08-18 22:51:17 · 245 阅读 · 0 评论 -
NWERC 2017 :Installing Apps(背包+贪心)
题目:有一个手机,容量为CCC,网上有NNN个app,每个app有个安装包大小did_idi,有个安装后的占用空间大小sis_isi,安装app是瞬间完成的,即app的占用空间可以瞬间由did_idi变成sis_isi,而不需要其他多余的空间。问这个手机最多可以安装多少个app,输出最多可以安装的app数量和安装顺序。分析:若 d < s,则 d 没有作用,只考虑 s 就可以...原创 2018-11-03 20:42:54 · 556 阅读 · 2 评论