动态规划
文章平均质量分 71
YanzheShi
这个作者很懒,什么都没留下…
展开
-
poj4512(2013腾讯编程马拉松——完美队形1)(动规)
题目链接:点击打开链接解题思路:这道题与最长上升字序列有些类似,只不过是个对称的最长上升子序列。解题思路仍是动态规划。子问题:前j个数字和后i个数字组成的序列中的队形长度。状态转移: 如果a[i] == a[j] 那么队列的长度等于前j-1和后i-1个数字组成的队列中中间数字小于a[i]的队列的长度加上2,代码如下:#include #include #incl原创 2015-05-08 20:47:56 · 626 阅读 · 0 评论 -
HUD5282 Senior's String 详解(使用DP解决组合数学)
题意:假设两个字符串的最长公共子序列长度为L,求第一个字符串中有多少个长度为L的子序列是第二个字符串的子序列。显然找出一个字符串的所有长度为L的子序列是组合数学问题,如果枚举所有子串的时间复杂度是n! 级的。这里就需要用动态规划来解决。首先用dp[i][j]和num[i][j]分别记录x的前I个字母和y的前j 个字母的最长公共子序列的长度和个数。先求出dp, 然后求num:。求num[i][j]分原创 2015-07-27 20:34:46 · 827 阅读 · 0 评论 -
UVA12563 Jin Ge Jin Qu hao(DP, 背包+技巧)
题意:求在给定时间内,最多能唱多少歌曲,在最多歌曲的情况下,使唱的时间最长。该题类似于01背包问题,可用01背包问题的解题思路来求,每个歌曲相当于物品,歌曲的长度相等于物品重量,每个歌曲的“价值”为1。由于金歌劲曲时间最长,所以最后要留至少1秒时间开始唱金歌劲曲,所以计算t-1时间内最多唱的歌曲和时间,最终答案为歌曲数加1,时间加上金歌劲曲的时间。这里我使用滚动数组计算这个值, 用len记录t原创 2015-07-27 17:18:56 · 1375 阅读 · 0 评论 -
UVA 11400(DP)
题意给定n种类型灯泡,每个灯泡给出其电压v,电源花费k,每个灯的花费c和需求量l,现在通过用电压大的灯泡替换某些电压小的灯泡来减小总花费,求最小的花费。首先要说明的是,为求得最小花费,对于某种灯泡,要么全部替换,要么全不替换,这个很容易证明。这个问题难就难在如何找子问题。如果先按灯泡电压把灯泡从小到大进行排序,定义dp[i]为替换第i种灯泡后前i种灯泡的最小花费,因为对一种替换情况,不知道原创 2015-07-26 18:37:11 · 2602 阅读 · 2 评论 -
uva1471
这是LIS的变形,题意是求一个序列中去掉某个连续的序列后,能得到的最长连续递增序列的长度。 用DP的解法是:吧这个序列用数组a来记录,再分别用两个数组f记录以i结尾的最长连续递增序列的长度,g[i]记录以i开头的最长连续递增序列。然后像求DP求LIS一样遍历整个序列求出i前面所有小于a[i]的元素中以该元素结尾的最长序列f[j], 那么 dp[i] = g[j] + f[i], 这样时间复杂原创 2015-07-26 11:49:33 · 1713 阅读 · 0 评论 -
POJ2533, 最长上升子序列(贪心+二分查找时间复杂度O(nlogn))
解题思路参考这位大神的博客:点击打开链接。在这里,我介绍下我对该方法的理解。使用这种方法是对动态规划方法的一种优化,在用动态规划求解时,求到第i个元素的最长上升子序列时,是在前i-1个数中寻找,比第i个元素小的且最长上升子序列最大的元素的最长上升子序列,在其基础上加一即为到该元素的最长上升子序列。在这次查找中浪费了时间,原创 2015-04-17 11:27:35 · 1050 阅读 · 0 评论 -
UVA437(DP)
题意:求所给的n种石头最高能组成多高的塔,其中组成塔的石头的两条边必须分别大于它上面的石头的两条边。每种石头有无限个并且可以随意翻转。这道题容易迷惑人的一点是石头是无限的,但仔细考虑由于有大小的限制,所以同一个塔每种石头最多用2次,这样就相当于每种石头有两个了。显然,这是一道DAG上的动规,如果一个石头的两个边分别小于另一个石头的两条边,则说明这两个石头有边相连。由于石头可以随意翻转,所以一个原创 2015-07-26 15:30:22 · 618 阅读 · 2 评论 -
最大子矩阵和(poj1050 动规)
题意:给出一个数字矩阵,找出一个子矩阵,使得其中的数字之和最大。解题思路:这道题是对最大连续子串和的一种扩展。解决办法就是在二维矩阵转化为多个一维数组来求最大值。具体来说就是先固定所求子矩阵的左右边界i和j,然后求出每行从左边界到右边界的数之和,这样每行的和就可以作为一维数组的一个元素来求最大连续子串的和,这个和就是左右边界为i和j的最大矩形,枚举所有左右边界的情况,最后找出和的最大值即为最终原创 2015-05-12 20:10:51 · 742 阅读 · 0 评论 -
Poj2479(&poj2593)(动规)
题目链接:点击打开链接题意:在一个数组中找出两个不相交的串的的最大和。解题思路:这是最大连续和的一个变形,不同之处就在于是求两个不相交的串的最大和。容易想到的就是用两个数组来分别记录以i结尾的串最大和和以i开头的最大和,然后固定一个前一个或后一个串,遍历另一个串,找出其中最大的,然后改变前一个串,再找最大的,依次比较最终就得到最大值了,这样做的时间复杂度为O(n2)。但对于题目给的规模原创 2015-05-10 10:27:05 · 486 阅读 · 0 评论 -
UVA1625 Color Length(附 刘汝佳代码)
这是刘汝佳《算法竞赛入门经典第二版》的一道例题,只看书上的解释并没有理解,随后结合着代码才理解了。解题思路:用d[i][j]表示序列1移走i个元素和序列2移走j个元素的最小“代价”, 这个代价指的是由那些已经移出的字母合并而来的序列中已经出现但尚未结束的字母对总距离和的贡献。比如说一个合并而来的序列中有两个那样的字母,第一个在这个序列中后面有3个字母,另一个字母后面有2个字母,那么此时的代价就原创 2015-07-31 18:23:12 · 1018 阅读 · 1 评论