动态规划(Dynamic Programming)是算法的设计方法之一,通常用于最优化问题,此类问题可能有多种可行解,而我们希望找出一个最优的解(最大或最小)。动态规划的设计可以分为以下几个步骤:
1.描述最优解的结构
2.递归的定义最优解的值
3.按自底向上的方式计算最优解的值
4.由计算出的结果构造一个最优解
...
分类:
其他好文 时间:
2015-01-29 14:42:38
阅读次数:
182
记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。
一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。
更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。
记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,
以后再次遇到这个状态的时候,就不必重新求解了。
这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。...
分类:
其他好文 时间:
2015-01-29 14:38:55
阅读次数:
259
原题地址动态规划题,注意0导致的小陷阱。代码: 1 int numDecodings(string s) { 2 if (s.empty() || s[0] '9') return 0; 3 4 int sum = s[s.length() - 1...
分类:
其他好文 时间:
2015-01-29 14:00:55
阅读次数:
150
#include #include #include #include using namespace std;struct node{ int x, y, z, h;};bool cmp(node a, node b){ return a.x*a.y b) {t=a; a=b; b=t;} if(...
分类:
其他好文 时间:
2015-01-29 12:25:36
阅读次数:
172
题目意思:给出k个模式串,然后随机生成一个长度为L字符串,每个字符被选中的概率为pi 。 问构造出来的字符串不包含任何模式串的概率。
分析:显然这是一个模式串的母串的匹配,显然需要先构建一个AC自动机。我们用dp[i][j] 表示当前正在构造第i个字符,fail指针在j节点上能构造成功的概率。那么我们可以顺着fail指针向后面的状态。 注意只能扩展有效状态,也即不包含任何模式串的状态。 也即
...
分类:
其他好文 时间:
2015-01-29 10:32:56
阅读次数:
280
上一篇讲了贪心算法来解活动选择问题(【算法导论】贪心算法之活动选择问题),发现后面有一道练习16.1-1是要用动态规划来解活动选择问题。其实跟之前的矩阵链乘法有些相似,也是考虑分割的活动是哪一个,并用二维数据来记录Sij---最大兼容集合个数,和用另一个二维数据来记录Sij取得最大时的活动分割点k。然后就是考虑边界问题,和使用递归来求动态规划的最优解。
#i...
分类:
编程语言 时间:
2015-01-28 22:36:17
阅读次数:
408
题目链接:Regular Expression Matching
Implement regular expression matching with support for '.' and '*'.
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
The match...
分类:
其他好文 时间:
2015-01-28 21:29:00
阅读次数:
318
原题地址与Word Break II(参见这篇文章)相比,只需要判断是否可行,不需要构造解,简单一些。依然是动态规划。代码: 1 bool wordBreak(string s, unordered_set &dict) { 2 int maxLen = 0; 3 f...
分类:
其他好文 时间:
2015-01-28 12:46:20
阅读次数:
150
题目大意:给定一棵树和两组权值,求第一组权值最少改变多少个之后这棵树经过重标号之后与第二组权值相同
这个题做法很神- -
首先和3162一样的处理方式 我们先找到这棵树的重心作为根 如果重心有两个就新建一个根连向这两个重心
令f[x][y]表示x所在子树的第一组权值和y所在子树的第二组权值匹配的最小花销
转移的必要条件是x所在的子树与y所在的子树同构且x与y深度相同
为了保证无后效性,x...
分类:
其他好文 时间:
2015-01-28 09:47:34
阅读次数:
235