dp
sheng4204
这个作者很懒,什么都没留下…
展开
-
最长01交替子串(浪潮笔试题)
题意:给一个只有0和1的字符串,允许反转一个连续区间,即0变成1,1变成0,求最长的01交替串多长,允许不连续。我最先想到的是动态规划解法,状态设计方面,首先一个串的状态会有以0结尾和以1结尾两种,然后题目中说允许反转一个连续区间,那么根据反转的前后,可以分为反转前,反转中(最后一个字符是被反转的)和反转后,所以组合起来,状态一共有6种,即反转前0结尾、反转中0结尾(未反转时为0,反转后为1)、反转后0结尾、反转前1结尾、反转中1结尾(未反转时为1,反转后为0)、反转后1结尾,然后每个状态的字符串具体是原创 2020-07-12 19:31:23 · 4545 阅读 · 4 评论 -
ural 2072 - Kirill the Gardener 3 - dp
题意:有n朵花,要求按照权值递增的顺序浇水,浇水一次话一个时间,走一个单位长度花费一个单位时间。一共n朵花,那么可以先计算出走路用的时间,然后加上n就是总时间,对于权值相同的所有花,就可以只考虑两个端点,这样中间的一定会路过,先走左端点还是先走右端点是不确定的,可以先按照权值大小进行排序,然后按照权值递增处理成多个不同的区间,之后用动态规划处理,dp[i][0]表示走到第i个区间左端点再走右端原创 2016-08-23 11:40:23 · 656 阅读 · 0 评论 -
uvalive 6697 - Homework Evaluation - dp
题意:给出两个字符串,用第二个字符串去匹配第一个字符串,可以对第二个字符串进行删除或插入操作,一位匹配成功得8分失败-5分,如果插入或删除,对于连续插入或删除m个数减(4+m * 3)分。求最终得分的最大值。用dp[i][j]表示第二个串的第i位和第一个串的第j位匹配得分的最大值,dp[i][j]可以是dp[i - 1][j - 1]继续匹配也可能是dp[i - 1][k]通过插入一段串得到或原创 2016-08-23 20:01:34 · 318 阅读 · 0 评论 -
hdu 4433(uva1631) - Locker - dp
题意:给出一个密码锁的当前状态,问最少转动多少次可以得到终止状态,每次转可以向上向下,而且转动一个位置的时候可以带动后面的一个或两个位置一块转。对于每一个位置,记录当该位置已经转完以后带动后面两个位置转动不同次数所需要的最少转动次数。#include #include #include #include using namespace std;const int MAXN = 1原创 2016-09-06 17:48:35 · 372 阅读 · 0 评论 -
uva - 1629 Cake slicing(dp)
题意:n行m列的网格蛋糕上有一些樱桃,每次可以用刀沿着网格线切成两块,问要想使最终每块蛋糕上恰好有一颗樱桃,切得最小长度。直接正向去想怎样切感觉不好想,但是可以反过来,像区间拼接一样考虑把当个网格的蛋糕拼接起来,拼接的长度就是要切的长度。dp[a][b][c][d]表示从(a, b)点到(c, d)的矩形范围内拼接的最短长度,num[a][b][c][d]用来统计这个矩形区域内的樱桃数量。原创 2016-10-09 16:13:26 · 326 阅读 · 0 评论 -
hdu 5898 - odd-even number (2016沈阳网络赛) - 数位dp
题意:如果一个数字连续的奇数都为偶数个,连续的偶数个数都为奇数,那么这个数字就是奇偶数,输入l,r,问[l, r]闭区间有多少个奇偶数。数位dp用dp[i][j][k]表示长度为i并且最高位为j的数字并且与最高位数字奇偶情况相同的连续位数为k的满足题目条件的数字有多少个,k=0表示偶数长度,k=1表示奇数长度。状态转移的条件会比较麻烦:如果高位为奇数位偶数,可以向偶数位偶数和奇数位奇数转移原创 2016-09-21 15:29:22 · 445 阅读 · 0 评论 -
hdu 5900 - QSC and Master (2016沈阳网络赛)区间dp
题意:输入n组键值对,如果相邻两个键的最大公约数不为1,那么可以删除这两组键值对,并得到两个值相加的分数,问最大得分是多少。注意两组键值对删除以后会使原本不相邻的变成相邻。比较明显的区间dp,用dp[i][j]表示区间[i, j]的最大得分,对于所有的i#include #include #include #include using namespace std;typede原创 2016-09-21 15:41:03 · 264 阅读 · 0 评论 -
UVALive 6853 - Concert Tour (dp)
题意:有s个月,c个城市,给出第几个月在第几个城市举办演唱会的收益,并且给出从一个城市到另一个城市的成本,求最大的收益。到达第一个城市不需要成本。用dp[i][j]表示第j个月在第i个城市举办演唱会可以得到的最大收益。dp[i][j] = max(dp[i][j], dp[k][j - 1] + id[i][j] - mp[k][i]);k是上个月举办演唱会的城市。#include原创 2016-09-21 17:07:37 · 251 阅读 · 0 评论 -
Leetcode 10 Regular Expression Matching (dp)
给出两个字符串s、p,'.'可以匹配任意一个字符,'*'可以将其前一个的字符重复任意次数,也可以重复0次(ab*可以表示ab、abb,也可以表示a),问是否可以匹配成功。应该算是比较明显的动态规划吧,一看就猜是动态规划,不过leetcode是没有数据范围的,不知道比较暴力的方法能不能过。虽然很快看出来了,但是太久没写过dp了,调了好久才好。好,说重点,我用dp[i][j]表示s的前i个和p...原创 2019-03-21 21:47:35 · 123 阅读 · 0 评论 -
LeetCode 638. Shopping Offers(入门 状压dp)
给出n种商品的价格以及需求量,以及一些套餐的优惠价,问最少花多少钱,任何一种商品都不能多买。不超过6种商品,每种商品需求不超过6个,但是可能有100种套餐。leetcode感觉题目普遍偏简单一点,状压dp竟然定义难度是中等,不知道是不是我搞麻烦了。每种商品不超过6个,那么需要占三位,6种商品就是18位(这样相当于使用8进制数,也可以自己计算6进制数,那样可以更节省空间),注意要尽可能的...原创 2019-03-24 15:49:52 · 300 阅读 · 0 评论 -
UVALive 6624 - Card Trick - 概率dp
题意:有很多张牌,当翻开一张数值是x,那就再翻这张牌后面的第x张,直到翻到一张他后面的第x张不存在,给出一个人翻牌的起始位置,翻的n张牌,问第二个人从前十张任意一张开始翻,结束位置和第一个人相同的概率。J,Q,K的值都是10,A是11。比较水的概率dp,只是一开始没读懂题……从前十个位置开始,那么就是前十个位置的概率初始值为0.1,其余为0,如果第一个人翻开了的位置,那么数字就是确定的了,一定原创 2016-08-22 12:56:47 · 533 阅读 · 0 评论 -
UVALive 7374 Racing Gems - dp,最长上升子序列
题意:赛车从x轴出发往前走,竖直方向速度为v,水平速度要在-v/r到v/r之间,给出n个钻石的坐标,问赛车最多能拿到多少颗钻石。在打组队赛的时候,我就想到了动态规划加线段树优化或者是最长上升子序列的nlog(n)算法,但是都没有想到具体该怎么处理,之后证实这两种方法都能实现,不过由于线段树还是比较麻烦,所以只实现了最长上升子序列的方法。这是一个很巧妙的处理,对于每一个钻石的坐标,都能根据水原创 2016-08-22 10:39:52 · 370 阅读 · 0 评论 -
uva 1331 Minimax Triangulation
给出一个多边形求三角分割使分割得到的最大三角形最小。可以是凹多边形,这一点比较坑~~区间dp,跟最优三角剖分差不多, 状态转移:dp[j][j + i] = min(dp[j][j + i], max(max(dp[j][k], dp[k][j + i]), area(j, k, i + j)))从j到j+i的分割得到的最大面积;注意因为可以是凹多边形,所以会有一些不可以分割的原创 2016-07-05 17:17:32 · 379 阅读 · 0 评论 -
uva-1626 Brackets sequence 区间dp
给一个只含有()[]的序列添加最少的符号使括号成为正规序列如果s可以分成[s']或(s')则转移到s'状态,然后对于区间[j, l]将区间分成两部分, dp[j][l] = min(dp[j][l], dp[j][k] + dp[k + 1][l]), j 在处理过程中用c[i][j]记录区间[i, j]最优的分割点, 如果值为-1表示按第一种方式转移最佳,借助c数组递归输出最优解。#原创 2016-07-05 17:33:33 · 265 阅读 · 0 评论 -
HDU-3689 Let the light guide us 线段树+DP
题意:输入n,m,然后两个n*m的矩阵,第一个代表在这个位置建塔的成本,第二个代表在相应位置建塔能照的距离,要求每行建一个,并且相邻两行的两个塔要满足照的距离之和大于等于列号差。求最小成本。分析:每一行中建立一个塔后会在这行照亮一段距离,如果下一行中的一个点能照到这段区间,表示这两个是可以同时建的。也就是下一行中的一个点要在这一行中的对应区间找一个成本最小值,动态规划的状态传递比较好写,只是一原创 2016-08-04 20:51:32 · 329 阅读 · 0 评论 -
HDU 3689 字符串匹配 + 概率DP
题意:给出n和m表示一共有m中字符,给出每种字符被猴子敲击的概率,求猴子在m次敲击之后内容中包含目标字符串的概率。一开始以为是一个很直接的概率dp,但是写完一测样例发现比实际结果总是小,然后我想到在匹配失败的时候不总是退到0重新匹配,第一个样例如果错敲w的话就应该退到1继续匹配,然后进一步想到要用kmp求next值,无奈kmp一直不会啊,还不能用模板,但是字符串长度最大不超过10,直接暴就好了原创 2016-08-05 09:27:49 · 331 阅读 · 0 评论 -
uva-1484(hdu-3660) Alice and Bob's Trip 听说是树形dp
下午组队赛遇到的题,是在hdu上判,一直在超时,各种优化之后还是超时,最后无奈从别人博客上贴代码交,竟然还是超时,但是后来我在uva 上交,我的代码只跑了300多ms,呵呵……,然后我看那个题在hdu上最后一次ac发生在今年1月6号,我也发现还有好多和我有着同样遭遇的,果断放弃,所有下面的代码c++和java都只能在uva 上通过。(之所以要写两遍,是我寄希望于java能通过hdu诡异的测试,但是原创 2016-08-16 20:18:06 · 554 阅读 · 0 评论 -
hdu-3664 Permutation Counting ,dp
题意:问n个数有多少种排列满足ai > i的个数为k个。用dp[i][j]表示n=i, k = j的情况,那么如果将第i+1个数插入有dp[i][j] * (i + 1)个位置,有一部分会传递到dp[i + 1][j], 另一部分传递到dp[i + 1][j + 1],但是水平比较low,并没有推出来怎么传递,但是用暴力打出来n从1到10的情况,就看出来了。mp[i][j] = mp[i原创 2016-08-17 11:09:09 · 267 阅读 · 0 评论 -
HDU 3236 Gift Hunting dp 背包
题意:两个背包,容量分别为v1、v2,有一些为必须装载的物品,然后可以加一个物品而不占背包空间。背包的变形,dp[i][j][k]表示背包1空间为i,背包2空间为j能容纳最大的价值,k = 0表示还没有拿不占空间的物品,k=0表示拿过了,p表示物品占得空间,传递方向dp[i][j][0]向dp[i][j][1]转移,dp[i-p][j][k]和dp[i][j - p][k]都要向dp[i][j原创 2016-08-05 19:38:30 · 207 阅读 · 0 评论 -
uva 1645 Count dp
题意:求n个节点的有根数,有多少种情况满足每个深度中所有节点的子节点个数相同。也就是说,每个节点的所有子树都是相同的,dp[i] = sum(dp[k] * j + 1),k * j + 1 = i。最终的结果还要求鱼#include #include #include using namespace std;int dp[1005];int m = 1000000007;int原创 2016-08-05 20:59:51 · 216 阅读 · 0 评论 -
uva 1213 Sum of Different Primes, dp
紫书第十章的习题,有一个被放到第十章的动态规划题。题意:输入n和k问n通过k个素数相加得到有多少种方案。先用筛法把题目范围内要用的素数找出来,然后动规求解,根背包差不多。dp[i][j]表示i用j个素数表示的方案数。原创 2016-08-05 21:14:41 · 282 阅读 · 0 评论 -
POJ-3254 Corn Fields 状压dp入门
题意:n*m个方格,在数字为1的方格中可以种草,相邻的方格不能同时种,问一共有多少种种法。dp[i][j]表示第i行的状态为j时有多少种种法,j为状态的2进制数,1表示种,0表示不种。#include #include #include using namespace std;int dp[13][5000];int d[13];int pw[20];const int MOD原创 2016-04-28 17:46:57 · 285 阅读 · 0 评论