原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1425
DP题。 f[i][j]表示当前数字为i,分解式中最大质数为j的方案数,那么,状态转移方程为: f[i][j] = sum(f[i-j][k]) 其中...
分类:
其他好文 时间:
2014-05-17 20:41:17
阅读次数:
296
问题:
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
思路:
这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c...
分类:
其他好文 时间:
2014-05-15 23:50:57
阅读次数:
421
动态规划的核心是状态和状态转移方程。01背包问题是最基本的背包问题,它包含了背包问题中状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成01背包问题求解。...
分类:
其他好文 时间:
2014-05-14 00:40:03
阅读次数:
276
可以用递归简洁的写出,但是会超时。
dp嘛。这个问题需要从后往前算,最右下角的小规模是已知的,边界也很明显,是最后一行和最后一列,行走方向的限制决定了这些位置的走法是唯一的,可以先算出来。然后不断的往前推算。
用distance[i][j]保存从当前位置走到最右下角所需的最短距离,状态转移方程是从distance[i+1][j]和distance[i][j+1]中选一个小的,然后再加上自身的。...
分类:
其他好文 时间:
2014-05-13 00:13:56
阅读次数:
339
最小编辑距离,很经典的问题,今年微软实习生的笔试有一个这个的扩展版,牵扯到模板之类的,当时一行代码也没写出来。。
dp可以很优雅的解决这个问题,状态转移方程也很明确。用pos[i][j]表示word1的前i个字符与word2的前j个字符之间的编辑距离。如果word[i-1]与word[j-1]相等,那pos[i][j]与pos[i-1][j-1]相等,否则的话,根据编辑的几种操作,可以从三种情况...
分类:
其他好文 时间:
2014-05-11 04:56:00
阅读次数:
301
dp是很好想的了,关键是数据太大,普通dp肯定超时,所以一定有用某种优化,dp优化也就那么几种,这道题用的是斜率优化,先写出普通的状态转移方程:
dp[i] = min{ dp[j] + Σ ( p[k] * (x[i] - x[k] ) ), j+1 #include #include #inc....
分类:
其他好文 时间:
2014-05-09 16:05:35
阅读次数:
301
原题地址:http://www.rqnoj.cn/problem/82解题思路:
简单的动态规划 状态表示:DP[i][0]表示当前在第i层,且当前跳跃状态不可用,此时消耗的最短时间。
DP[i][1]表示当前在第i层,且当前跳跃状态可用,此时消耗的最短时间。 状态转移方程: ...
分类:
其他好文 时间:
2014-05-09 10:15:50
阅读次数:
286
有关这种字符串的题真是层出不穷啊,而且他们都有这样一个特点,就是递归的思路如此简单,但一定超时!
这个时候,dp就朝我们缓缓走来。递归超,dp搞!这道题的状态转移方程还是比较好写的,用ispart[i][j]代表s1贡献i长,s2贡献j长时,能不能形成s3的前i+j个字符。更新可以按照行或者列开始,s3的前i+j个字符,可以是((i-1)+1)+j构成,也可以是i+((j-1)+1)构成,这取决...
分类:
其他好文 时间:
2014-05-09 06:16:48
阅读次数:
232
告诉你n种规模的长方体的长,宽,高,每种规模的长方体个数不限,问你最多能搭多高的塔,塔是由这些长方体搭的,自上而下,每一块长方体都要比在它下面的长方体的规模小,即长和宽都比下面的长方体要小。注意长方体是可以调整的。
我们用dp[i]来表示搭建到第i块长方体的时候塔的最高高度,那么状态转移方程就是dp[i]=max(dp[i],dp[j]+s[i].h);
#include
#include...
分类:
其他好文 时间:
2014-05-07 21:31:35
阅读次数:
291
很好的一道动态规划法题目。
注意:
1 行列别搞错了,要很细心一点一点对起来
2 要以边线思考,不要以方块来计算, N*M个方块就成了(N+1)*(M+1)条交叉线了,最下面和最左边的线就方便初始化了
3 注意C++的四舍五入的方法
动态规划的状态转移方程:
if (A[y][x]) B[x] = t + 1.414213562;
else B[x] = min(B[x-1], B[x]) + 1 ;
A[y][x]表示是否有对角线,有对角线必定是走对角线的。...
分类:
其他好文 时间:
2014-04-30 22:21:38
阅读次数:
369