动态规划——线性结构(一维,二维)
文章平均质量分 81
XDU_Skyline
Everything is over, everything is just beginning.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
2015编程之美初赛第一场 B 建造金字塔
时间限制:4000ms单点时限:2000ms内存限制:256MB描述在二次元中,金字塔是一个底边在x轴上的等腰直角三角形。你是二次元世界的一个建筑承包商。现在有N个建造订单,每个订单有一个收益w,即建造此金字塔可获得w的收益。对每个订单可以选择建造或不建造。建造一个金字塔的成本是金字塔的面积,如果两个或多个金字塔有重叠面积,则建造这些金字塔时重叠部份原创 2015-04-26 11:02:43 · 1241 阅读 · 0 评论 -
例题9-8 颜色的长度 UVa1625
1.题目描述:点击打开链接2.解题思路:本题利用区间dp解决,但是本题是一道比较复杂的区间dp,做法不太容易理解,需要慢慢分析。首先,题目要求我们寻找一种合并的方式,使得最后的总代价最小,这里的总代价就是题目中所说的不同字母的L(i)值的和。然而本题不能按照以往的经验,把两个序列分别已经移动走了i和j个元素,还需要多少代价作为状态,因为这样的定义并不知道某个字符什么时候会结束,而当字符结束时候原创 2015-08-23 17:22:28 · 933 阅读 · 0 评论 -
例题8-8 防线 UVa1471
1.题目描述:点击打开链接2.解题思路:本题要求在一个长度为n的序列中,删除一段连续子序列,使得剩下的序列有一个长度最大的连续递增子序列。按照以往的经验,可以事先用f[i]计算出从i出发的最长连续递增子序列的长度,用g[i]表示以i结尾的最长连续递增子序列的长度,然后枚举j,i(j本题的优化环节就在于已知一个i,如何快速找到一个j。由于我们希望得到的连续递增子序列尽可能的长,那么我原创 2015-08-24 22:25:00 · 1343 阅读 · 0 评论 -
例题1.28 Sum游戏 UVa10891
1.题目描述:点击打开链接2.解题思路:本题是一道经典的利用递推式优化dp的题目,非常值得学习。首先,根据题意描述:不管怎么取,任何时刻的游戏状态都是原始序列的一段连续子序列,因此,我们想到用d(i,j)表示原序列的第i~j个元素的子序列(元素编号为1~n),在双方都采取最优策略的情况下,先手得分的最大值(只考虑i~j这些元素)。状态转移时,我们需要枚举从左边取还是从右边取以及取多少个。这原创 2015-05-23 21:04:59 · 549 阅读 · 0 评论 -
例题3.11 背单词 LA3942
1.题目描述:点击打开链接2.解题思路:本题利用Trie+dp解决。首先,令d(i)表示从字符i开始的字符串(即后缀S[i...L])的分解方案数,那么d(i)=d(i+len(x)|单词x是S[i..L]的前缀)。如果我们枚举单词,然后判断它是否为S[i...L]的前缀,时间无法承受。所以可以考虑事先把所有的单词存入Trie,然后试着在Trie中查找S[i...L]。查找时,如果找到了一个单原创 2015-08-27 23:25:04 · 1176 阅读 · 0 评论 -
HDU 1003 Max Sum
1.题目描述:点击打开链接2.解题思路:本题是经典的最大连续和问题,效率高的解决方法有两种:(1)利用公式:A[i]+A[i+1]+...+A[j]=S[j]-S[i-1];(2)利用动态规划;(3)边读入边计算(精简版的动态规划)。对于(1),二重循环还是会TLE的,应该事先计算好0~j之间的最小值及其位置。对于(2)定义d(i)表示以i结尾的最大连续字串的和,再用一个辅助变量保存开始值s,原创 2015-02-12 20:55:27 · 538 阅读 · 0 评论 -
例题9-7 划分成回文串 UVa11584
1.题目描述:点击打开链接2.解题思路:本题要求划分回文串,且个数尽可能的少。可以用动态规划解决。先提前判断i~j是否构成回文串,时间复杂度是O(N^2),然后定义d(i)表示0~i-1划分成的回文串的最小个数。则状态转移方程为:d(i)=min(d(i),d(j)+1)(s[j...i]是回文串)上式中,d(i)的初始值是i,这样每次判断只需要O(1)的时间,总时间复杂度是O(N^2原创 2015-02-13 12:56:36 · 831 阅读 · 0 评论 -
LA3530 Martian Mining
1.题目描述:点击打开链接2.解题思路:本题是棋盘型的dp.。根据题目描述,我们会发现一个特点,即如果给定了右下角(i,j),那么可以得到如下的状态转移方程:dp(i,j)=max{dp(i-1,j)+suma(i,j),dp(i,j-1)+sumb(i,j)};上式中,suma(i,j)表示第i行a的前缀和,sumb(i,j)表示第j列b的前缀和。最终的答案就是dp(n,m)。3原创 2015-10-07 21:06:27 · 470 阅读 · 0 评论 -
UVa10534 Wavio Sequence
1.题目描述:点击打开链接2.解题思路:本题是一道需要求解LIS的题目,因为n的范围比较大,这里需要利用O(NlogN)的算法来求解。首先,求出从左往右的LIS和从右往左的LIS(即从左往右的LDS)。那么,最终只需要扫描一遍,答案为2*min(LIS[i],LDS[i])-1。因为如果LIS[i]有k个元素且LIS[i]3.代码:#include#include#include原创 2015-10-07 22:23:27 · 340 阅读 · 0 评论
分享