- 博客(7)
- 资源 (15)
- 收藏
- 关注
原创 UVA1625 Color Length(附 刘汝佳代码)
这是刘汝佳《算法竞赛入门经典第二版》的一道例题,只看书上的解释并没有理解,随后结合着代码才理解了。 解题思路:用d[i][j]表示序列1移走i个元素和序列2移走j个元素的最小“代价”, 这个代价指的是由那些已经移出的字母合并而来的序列中已经出现但尚未结束的字母对总距离和的贡献。比如说一个合并而来的序列中有两个那样的字母,第一个在这个序列中后面有3个字母,另一个字母后面有2个字母,那么此时的代价就
2015-07-31 18:23:12 1012 1
原创 hdu5317 RGCDQ
首先计算出所有的f,这里容易超时,注意对优化。 易知f中的最大值为7,然后用一个数组d[i][j]记录f[1]到f[i]中有多少个j,这个用递推可得。 那么如果给定区间L, R, 则f[R][j] - f[L - 1][j]可算出1到7各出现了多少次, 根据这些次数就可以找出最大公约数了。代码如下: #include #include #include using namespace s
2015-07-28 19:00:45 656 1
原创 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 825
原创 UVA12563 Jin Ge Jin Qu hao(DP, 背包+技巧)
题意:求在给定时间内,最多能唱多少歌曲,在最多歌曲的情况下,使唱的时间最长。 该题类似于01背包问题,可用01背包问题的解题思路来求,每个歌曲相当于物品,歌曲的长度相等于物品重量,每个歌曲的“价值”为1。由于金歌劲曲时间最长,所以最后要留至少1秒时间开始唱金歌劲曲,所以计算t-1时间内最多唱的歌曲和时间,最终答案为歌曲数加1,时间加上金歌劲曲的时间。这里我使用滚动数组计算这个值, 用len记录t
2015-07-27 17:18:56 1368
原创 UVA 11400(DP)
题意给定n种类型灯泡,每个灯泡给出其电压v,电源花费k,每个灯的花费c和需求量l,现在通过用电压大的灯泡替换某些电压小的灯泡来减小总花费,求最小的花费。 首先要说明的是,为求得最小花费,对于某种灯泡,要么全部替换,要么全不替换,这个很容易证明。 这个问题难就难在如何找子问题。如果先按灯泡电压把灯泡从小到大进行排序,定义dp[i]为替换第i种灯泡后前i种灯泡的最小花费,因为对一种替换情况,不知道
2015-07-26 18:37:11 2596 2
原创 UVA437(DP)
题意:求所给的n种石头最高能组成多高的塔,其中组成塔的石头的两条边必须分别大于它上面的石头的两条边。每种石头有无限个并且可以随意翻转。 这道题容易迷惑人的一点是石头是无限的,但仔细考虑由于有大小的限制,所以同一个塔每种石头最多用2次,这样就相当于每种石头有两个了。显然,这是一道DAG上的动规,如果一个石头的两个边分别小于另一个石头的两条边,则说明这两个石头有边相连。由于石头可以随意翻转,所以一个
2015-07-26 15:30:22 615 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 1708
程序员面试宝典
2014-06-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人