ACM —— 动态规划
文章平均质量分 74
Konjac.k
这个作者很懒,什么都没留下…
展开
-
nefu 169 步步惊心
步步惊心Problem : 169 Time Limit : 1000ms Memory Limit : 65536Kdescription马尔泰·若曦是康熙年间镇西大将军马尔泰的小女儿,自幼失母,却深得父亲姐姐宠爱,性格活泼任性。张晓,本是21世纪一都市白领,聪慧谨慎,玲珑剔透。因车祸而灵魂穿越到若曦身上,自此开始了步步惊心的宫庭之旅,并身不由己卷原创 2016-01-15 18:13:27 · 293 阅读 · 0 评论 -
HDU 6170 Two strings(dp)
题目:点击打开链接题意:给定两个字符串,假设为串a,串b。a由大写字母和小写字母组成,b由大写字母,小写字母,”.“,”*“ 组成。其中”.“可以代替任何的一个字母,”*“与其一个前缀如a*可代替a,aa,aaa...,以及空。(在这里注意的是a*可以是空 意味着*前面的一个字符和*可以一起去掉而不是只有*被去掉 比赛的时候题意理解错了QAQ) 最后判断a,b是否匹配。思路:比赛时暴力看错原创 2017-08-23 14:40:02 · 187 阅读 · 0 评论 -
HDU 6143 Killer Names(dp 思维)
题目:点击打开链接题意:给人起名字,姓 和 名,都是长度为n的字符串,要求从给定的m个字符中选取一些字符(相同或不同都可以),使得没有一个字符同时存在于姓和名中。思路:相当于涂色,给m个颜色,为两个长度为n的单元格涂色,要求两个区域没有共同的颜色。这个题的方法就是先解决姓,得到长度为n的分别用了j=1->m种颜色的方案数,那么对于名,就是(m-j)^n,即剩下的颜色填到n个格子的方案数。原创 2017-08-18 12:33:45 · 192 阅读 · 0 评论 -
HDU 6092 Rikka with Subset(01背包 思维)
题目:点击打开链接题意:给你n,m。有一个数列a,a中有n个元素。输入m+1个数,第i个数表示把数列a当成一个集合,集合a的 和为i的 子集 的个数为b[i],集合a中所有数之和为m。解释样例1:m+1个数为1 1 1 1,表示集合a中和为0的有1个(空集),和为1的有1个({1}),和为2的有1个({2};{1,1}不行,因为{1}只有1个),和为3的有1个({1,2}),且所有数之和原创 2017-08-09 15:33:36 · 269 阅读 · 0 评论 -
HDU 3033 I love sneakers!(分组背包)
题目:点击打开链接题意:有n双鞋,有m总现金,这n双鞋属于p种品牌。然后给你每双鞋的品牌号,价格,价值。要求每个品牌至少买一双,可以买多双,求最大价值。解法:一或多分组背包问题,先预处理,c[i][j]:品牌号为i的第j双鞋的价格,v[i][j]:品牌号为i的第j双鞋价值。三重循环里k枚举k种品牌 i为第k种品牌中第i双鞋 j从总现金m到c[k][i]。这里需要处理dp初始原创 2016-11-08 20:50:50 · 274 阅读 · 0 评论 -
HDU 1712 ACboy needs your help(分组背包)
题目:点击打开链接题意:给你一个n行m列的矩阵a,a[i][j]:完成第i科目的复习花费j天能够获得的效益,求花费总天数m天能得到的最大效益。解法:因为对于a[i],只能选一种复习天数j来复习这一科,所以是0或1分组。三层循环 k 组数,j 从最大m天(即背包总容量V)到0,i 第k组所有情况这个题中也就是每一组的天数 都是1到m。状态转移方程:f[j]=max(f[j原创 2016-11-08 21:37:18 · 205 阅读 · 0 评论 -
HDU 6035 Colorful Tree(树形dp)
题目:点击打开链接题意:给n个点,每个点有一个颜色值c[i],给n-1条边,保证能够连成一个树。定义树上每两个点间的距离为这两点间的颜色种类数,求整棵树的所有路径长度和,路径总数为n*(n-1)/2思路:要求总路径长度和,即求每条路径上颜色的种数的和,可以通过求每种颜色不在某一条路径上的和=ans,最后用路径总数*颜色总数-ans得到最终答案。具体点就是用vector容器存边,对于树上的一原创 2017-07-29 18:11:06 · 207 阅读 · 0 评论 -
HDU 5642 King's Order(递推)
题目:点击打开链接题意:国王说话结巴,但结巴的末尾字母长度不会超过3次为合法,求合法单词个数,看hint递推一下即可解法:dp[i][j]:i长度 j个末尾长度相等,j只能取1,2,3,纸上写写dp的前几个推推就出来了。代码:123456789101112131415161718192021222324原创 2016-10-18 22:20:18 · 248 阅读 · 0 评论 -
POJ 2385 Apple Catching(递推)
题目:点击打开链接题意:有两棵树,初始在1树,T秒每一秒都有果子从其中一棵树掉落,你只能在这两棵树之间走W次,求最多能接到多少果子解法:dp[i][j][k]表示第i秒 走了j次 在k树,因为初始位置是1树,注意递推前首先要进行初始化dp[i][0][1]。代码:1234567891011121314151617181原创 2016-10-18 22:08:29 · 178 阅读 · 0 评论 -
HDU 1503 Advanced Fruits (递推)
题目:点击打开链接题意:给你两个单词,找出它们的最长公共子序列,输出一个含有最长公共子序列的最短单词。解法:lcs求最长公共子序列,dp[i][j]表示在s1的i位置,s2的j位置的最长公共子序列的长度;定义ans结构体倒序存最长公共子序列的字母,i存该字母在s1的位置,j存该字母在s2的位置;输出时分清情况一个字母一个字母的输出。代码:1234原创 2016-10-29 12:19:34 · 203 阅读 · 0 评论 -
HDU 1160 FatMouse's Speed(递推)
题目:点击打开链接题意:求一些老鼠体重从小到大并且速度从大到小的最长子序列,输出最长子序列中的老鼠的序号。解法:先把体重从小到大用结构体排序,体重相等的按速度从大到小排序;dp[i]表示到达第i只老鼠时的最长子序列的长度;pre[i]表示在i状态时上一个最长子序列位置;用b标记最终的那个最长的子序列的最后一位,res倒序存最长子序列中每一个元素的位置,最后倒序输出。代码:1原创 2016-10-29 12:40:10 · 205 阅读 · 0 评论 -
HDU 5119 Happy Matt Friends(递推+滚动数组)
题目:点击打开链接题意:给你n个数和一个数m,在这n个数中选任意个数求异或和,要求所得值大于等于m的种数。解法:dp[i][j]表示达到i状态异或结果为j的种数,状态转移方程:dp[i][j]=dp[i-1][j]+dp[i-1][j^a[i]];即取到第i个数时异或等于j的种数 等于取到第i-1个数时异或等于j的种数 + 取到第i-1个数时异或等于j^a[i]的种原创 2016-10-29 13:15:19 · 254 阅读 · 0 评论 -
Codeforce 429B Working out(递推)
题目:点击打开链接题意:一个人从左下往右上走,一个人从右上往左下走,求两人相遇时(不包括相遇点)的最大值解法:从四个角分别dp,每个相遇点的ans都是该点四周dp值的和,最终ans取max。代码:123456789101112131415161718192021222324252627282930原创 2016-10-13 12:15:20 · 255 阅读 · 0 评论 -
HUD 5092 Seam Carving(递推)
题目:点击打开链接题意:从第一行走左下,下,右下直到最后一行,输出最大路径,最大值相等输出靠右的思路:先从上往下dp到最后一排最右边的位置,记录下来之后从该点往上找代码:12345678910111213141516171819202122232425262728293031323334原创 2016-10-18 22:00:41 · 257 阅读 · 0 评论 -
HDU 1078 FatMouse and Cheese(递推)
题目:点击打开链接题意:老鼠能从上下左右四个方向走1 至 k长度吃到奶酪,但只能往多了吃不能吃了多的再吃少的,问所能吃到奶酪最大值解法:结构体排序+dp,条件中应有if (dp[i][j]) 表示该点走过 ,没走过不能往下执行代码:123456789101112131415161718192021222324原创 2016-10-18 21:53:59 · 230 阅读 · 0 评论 -
HDU 1963 Investment(完全背包)
题目:点击打开链接题意:给你一个本金和要存的年数N,再给你n种不同的股票,第i种股票的价格cost为c[i],价值value为v[i]。求怎么买股票N年后得到最多的总额(本金+利息)。解法:股票价格都是1000的倍数,所以通过将每种股票价格/1000且背包容量/1000进行所占空间的优化。背包容量每年都要更新。状态转移方程:dp[j]=max(dp[j],dp[j-c[原创 2016-11-12 21:40:57 · 254 阅读 · 0 评论 -
HDU 4472 count(递推)
题目:点击打开链接题意:构造一棵树,这棵树的每一层中的节点所拥有的子节点数相等,问有多少种构造方法。思路:对称性。根据题意,可以想到,把这棵树从中间劈开,两边一定是对称的,继续劈开左右两边的子树,依然对称。用a[i]表示节点数为 i 的树的构造方法数,a[j]表示节点数为 j 的树的构造方法数,其中 j 代码:#include using namespace std;cons原创 2017-09-16 10:13:29 · 296 阅读 · 0 评论