动态规划
webnoob
会点算法的前端程序猿~
展开
-
最大公共子序列LCS
概述什么是子序列? 对于一个序列,去掉其中n个序列项(n>=0),剩下的就是子序列。注意和子串区别,子串是要求要连续的。利用DP解决LCS问题:状态描述:lcs[i][j] 表示对于输入的两个字符串s1,s2,s1的前i个子串和s2的前j个子串的最大公共子序列长度。最优子结构:当s[i]=s[j],lcs[i][j]=l[i-1][j-1]+1;否则:lcs[i][j]=max(lcs[i原创 2016-09-11 16:26:01 · 561 阅读 · 0 评论 -
动态规划全解析
本人学习算法的时候,一直对动态规划报有一种恐惧的心理,直到学习了下面链接的dp全解析,才慢慢撸起动态规划的题目:http://www.cnblogs.com/sdjl/articles/1274312.html对于一道题目能否用dp,关键考虑以下几点:1、构造问题所对应的过程。2、思考过程的最后一个步骤,看看有哪些选择情况。 3、找到最后一步的子问题,确保符转载 2016-09-05 00:27:51 · 19032 阅读 · 0 评论 -
NYOJ-17 单调递增最长子序列
1.思路用dp[i]表示以a[i]为结束的最长递增子序列,最有子结构为dp[i]=max(dp[j]+1)(a[i]>a[j],j=i~0),dp[i]默认为1,自身也是递增的。2.代码:复杂为O(n^2)#include #include #define maxn 10009using namespace std;int main(){ int t;原创 2016-11-02 22:46:31 · 484 阅读 · 0 评论 -
NYOJ-15 括号匹配(二)
原题目链接1.思路区间Dp经典问题。最优子结构的表述如下:①若S为 [S’] 或 (S’),则我们只需要把 S’ 串变成规则的就可以了。②若S为[S’ 或 (S’ ,则我们只需要把 S‘ 串变成规则的,最后再加一个] 或)就可以了。③若S为 S’] 或 S’),则我们只需要把 S’ 串变成规则的,最后再在前面加一个[或(就可以了。④若找S[i……j]变成规则的最小数目,就是S[i……k] 和 S[k原创 2016-10-24 14:47:17 · 627 阅读 · 0 评论 -
NYOJ-10 skiing
source link1.tips深度搜索+动态规划。dp[i][j]表示从a[i,j]出发能滑行的最大长度。深搜相邻能滑行的点的最大长度+1。记得要进行记忆化搜索,能节约很多时间。2.code#include <iostream>#include <cstring>#define max(a,b) (a>b?a:b)using namespace std;int h[110][110];原创 2016-10-30 23:21:56 · 553 阅读 · 0 评论 -
NYOJ-18 The Triangle
source link1.tips求下三角矩阵的最大路径和。利用动态规划思想。dp[i][j]表示以点[i,j]结尾的最大路径和,最有子结构为: dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j], a[i][j]表示当前点的值。在矩阵的每行的开始和结束点做特殊处理就行了。2.code#include <iostream>using namespace s原创 2016-11-01 12:40:02 · 497 阅读 · 0 评论