一道dp基础题,给你两个序列,问你最长公共子序列是什么,比如:(a,b)是(a,c,d,b)的子序列。注意不是最长公共子串,这里的子序列可以不连续。
两个for循环就出来了,每一个dp[i][j]可以从dp[i-1][j-1]、dp[i-1][j]、dp[i][j-1]三种情况更新过来,取个最大的,然后把路径用123存下来,最后再顺着路径找然后逆序输出就行。...
分类:
其他好文 时间:
2015-04-26 10:54:56
阅读次数:
126
http://www.cnblogs.com/zhangchaoyang/articles/2012070.html
把一个问题转换为若干个规模更小的子问题,并且都借助于一个二维矩阵来实现计算。
约定:字符串S去掉最后一个字符T后为S',T1和T2分别是S1和S2的最后一个字符。
则dist(S1,S2)是下列4个值的最小者:
1.dist(S1',S2')--...
分类:
其他好文 时间:
2015-04-26 09:15:27
阅读次数:
118
出处http://segmentfault.com/blog/exploring/本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度;2. 与之类似但不同的最长公共子串方法。最长公共子串用动态规划可实现O(n^2)的时间复杂度,O(n^2)的空间复杂度;还可以...
分类:
编程语言 时间:
2015-04-23 15:05:12
阅读次数:
306
同网上大多数lcs算法一样。实现都是用dp来实现。状态转移方程就不写了。反正熟练于心。打印出包含a和b的最短序列。当然,a和b中的字符在新序列中的相对位置是不会改变的。主要是熟悉一下代码:#include #include using namespace std;char a[1000],b[100...
分类:
其他好文 时间:
2015-04-23 02:00:05
阅读次数:
166
1425: LCS与LIS
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 55 Solved: 25
SubmitStatusWeb Board
Description
LCS(最长公共子序列)是单身,LIS(最长上升子序列)也是单身,于是他们在一起了,变成了LCIS(最长公共上升子序列)o(╯□╰)o。你的任务是求给定两个序列...
分类:
其他好文 时间:
2015-04-21 09:50:48
阅读次数:
152
题目传送:UVA - 10192
思路:就是简单的最长公共子序列啦,不过输入居然还包含空格,然后很奇怪的TLE了,不是WA,心想n最大才100居然TLE,,好吧,可能有些数据特殊吧
AC代码:
#include
#include
#include
using namespace std;
char s1[105], s2[105];
int dp[10...
分类:
其他好文 时间:
2015-04-21 09:46:30
阅读次数:
196
最长公共子序列: dp[i][j] :当前子弹的最大得分,if ([i-1]==[j-1]) dp[i][j]=dp[i-1][j-1]+score[a[i-1]]; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); 1 #include 2 #inclu...
分类:
其他好文 时间:
2015-04-19 14:31:22
阅读次数:
112
题目大意:
两种水果可以杂交出一种新的水果,现在要给新水果起名字,起名的规则是:
这个名字要包含之前两种水果的名字的字母,要按原本字符串中字符的相对顺序。并且这个
名字要尽可能的短。
思路:
先求出两种水果名字s1和s2最长公共子序列的长度,并且用pre[i][j]标记下dp[i][j]的上一个状态,
来得到每个字符在新的字符串中的状态。然后从(len1,len2)回溯输出新的字符串序列。
pre[i][j] == 0表示为上一个字符为公共子串,将s1[i-1]或s2[j-1]输出一次,pre[i][j]...
分类:
其他好文 时间:
2015-04-18 11:33:59
阅读次数:
176
我们之前提到过过动态规划的几个经典问题:
动态规划原理:http://blog.csdn.net/ii1245712564/article/details/45040037
钢条切割问题:http://blog.csdn.net/ii1245712564/article/details/44464689
矩阵链乘法问题:http://blog.csdn.net/ii1245712564/ar...
分类:
其他好文 时间:
2015-04-15 13:43:15
阅读次数:
233