
动态规划-子序列
文章平均质量分 59
JeraKrs
本人目前就职于百度商业研发部,有需要内推的朋友简历可发我邮箱 jerakrs@qq.com
展开
-
uva 531 Compromise(LCS)
题目连接:531 - Compromise题目大意:给出两组字符串, 各含若干的字符串, 要求求两组字符串的最长公共子序列, 并输出最长的方案, 若有多种可能输出任意一种。解题思路:普通的最长子序列问题, 和一般求解一样, 不过要记录路径, 我的做法是开两各数组记录移动方式, x[p][q], y[p][q]。当x[p][q] == p - 1 && y[p][q] ==原创 2013-09-08 10:29:19 · 1357 阅读 · 0 评论 -
uva 10723 - Cyborg Genes(LIS)
题目连接:10723 - Cyborg Genes题目大意:给出两个字符串,找出第三个字符串,使得给出的两个字符串都是第三个字符串的子串,现在要求所得字符串最短,并且输出有多少种组成方法。解题思路:1、求长度:a)当s1[i - 1] == s2[j - 1]时, l[i][j] = l[i - 1][j - 1].b)当s1[i - 1] != s2[j - 1]原创 2013-10-01 15:11:32 · 1984 阅读 · 0 评论 -
uva 10599 - Robots(II)(LIS)
题目链接:10599 - Robots(II)题目大意:有一个row * col的矩阵,然后给出若干个坐标,代表该坐标上有垃圾,现在有一个机器人,支持向下以及向右的移动,每次移动到一个位置,可以将该位置上的垃圾清理掉,要求求出从(1,1)的位置到(row, col)最多能收多少垃圾,以及有多少条路线可以收最多的垃圾,并输出路径。解题思路:因为机器人只支持向右和向下,也就是说原创 2013-09-29 14:56:44 · 1670 阅读 · 0 评论 -
hdu 5087 Revenge of LIS II(LIS)
题目连接:hdu 5087 Revenge of LIS II题目大意:给定一个序列,求第2长的LIS长度。解题思路:用o(n^2)的算法求LIS,每个位置维护两个值,最大和最小即可。注意的是dp[0]中的最大第二大不能都复制成0.#include #include #include using namespace std;const int maxn = 1005原创 2014-11-07 16:55:25 · 926 阅读 · 0 评论 -
Codeforces 486E LIS of Sequence(线段树+LIS)
题目链接:Codeforces 486E LIS of Sequence题目大意:给定一个数组,现在要确定每个位置上的数属于哪一种类型。解题思路:先求出每个位置选的情况下的最长LIS,因为开始的想法,所以求LIS直接用线段树写了,没有改,可以用log(n)的算法直接求也是可以的。然后在从后向前做一次类似LIS,每次判断A[i]是否小于f[dp[i]+1],这样就可以确定该位原创 2014-11-13 13:01:30 · 1694 阅读 · 0 评论 -
hdu 5406 CRB and Apple(树状数组+dp)
题目链接:hdu 5406 CRB and Apple将树按照高度从大到小排序,高度相同的美味值小的放前面。然后高度值就没有用了,等于说对得到的美味值序列求两个不相交的LIS,使得长度和尽量长。对序列元素离散化后,dp[i][j]表示说两个序列的终止位置分别为i,j的最大长度。从左向右考虑每个美味值,复杂度o(n)。对于一个值c,更新dp数组,枚举第一维状态i,复杂度o(n)。dp[i原创 2015-08-21 22:23:40 · 1531 阅读 · 0 评论 -
hdu 5489 Removed Interval(线段树+LIS)
题目链接:hdu 5489 Removed Interval解题思路正序一遍LIS,逆序一遍LIS。在正序的时候维护一棵线段树,逆序做的时候可以查询当前位置向前间隔L之后,并且终止val小于当前位置的LIS。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn =原创 2015-10-01 21:44:41 · 1116 阅读 · 0 评论 -
hdu 4604 Deque(LIS)
题目链接:hdu 4604 Deque解题思路枚举位置i,即以A[i]为最终序列的中间值,那么从[i,N]的区间内,以A[i]+1为起点的非递减序列可以在操作中插入deque的后端。以A[i]为起点的非递增序列可以在操作中插入deque的前端。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;原创 2015-10-26 21:19:39 · 607 阅读 · 0 评论 -
hdu 4681 String(LIS+暴力)
题目连接:hdu 4681 String代码#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;typedef pair<int,int> pii;const int maxn = 1005;int N, M, K, l[maxn][maxn], r[maxn原创 2015-11-12 21:47:11 · 659 阅读 · 0 评论 -
uva 12002 - Happy Birthday(LIS)
题目链接:uva 12002 - Happy Birthday题目大意:给出一个序列,表示说有n个碟子,每个数字代表碟子的大小,现在开始堆碟子,可以选择在上面和下面放,不过放上面的碟子必须小于等于最上面的碟子,放在下面的碟子必须大于等于最下面的碟子。问说最多能放多少碟子。解题思路:和uva 11456 做法相似,只不过说这题可以取相同的大小,那么只需要分成两种情况考虑即原创 2014-03-27 13:07:05 · 1527 阅读 · 0 评论 -
uva 11456 - Trainsorting(LIS)
题目链接:uva 11456 - Trainsorting题目大意:给出n,表示有n节车厢,然后第i节车厢重量为t[i],位于第i个车站,列车长从有强迫症,一定要求说列车的车箱要按照质量从大到小排序,所以他按照序号一次经过每一个车站,可以考虑是否添加位于该车站的车厢,添加的话也只能放在已有车列的前端和后端,不能说从中间插入,问说列车最多能有多长。解题思路:将序列逆序储存,然原创 2014-03-11 16:31:00 · 1958 阅读 · 0 评论 -
uva 10635 - Prince and Princess(LCS)
题目连接:10635 - Prince and Princess题目大意:给出n, m, k,求两个长度分别为m + 1 和 k + 1且由1~n * n组成的序列的最长公共子序列长的。解题思路:按一般的o(n^2)的算法超时了,所以上网查了下LCS装换成LIS的算法o(nlogn)。算法仅仅是将其中的一个序列重新标号1~m,然后按最长公共子序列的方法去做。原创 2013-09-19 23:32:52 · 2084 阅读 · 0 评论 -
uva 11151 Longest Palindrome(LCS)
题目连接:11151 - Longest Palindrome题目大意:给出一个字符串,计算这个字符串的最长回文子串, 不同的是,它的子串可以不连续。解题思路:刚开始把这道题当成普通的回文串来做了, 用了manachar算法, 让后一直WA, 然后才发现原来子串可以不连续, 但是其实就是求当前这个字符串和其逆序的最长公共子序列。#include #includ原创 2013-09-07 22:58:53 · 1317 阅读 · 0 评论 -
uva 10192 - Vacation(LCS)
题目大意:10192 - Vacation题目大意:求两个字符串的最长公共子序列。解题思路:套用dp的状态转移方程。#include #include const int N = 1005;int max(const int& x, const int& y) { return x > y ? x : y; }int n, m, dp[N][N];c原创 2013-09-03 22:43:51 · 1247 阅读 · 0 评论 -
uva 10405 - Longest Common Subsequence(LCS)
题目连接:10405 - Longest Common Subsequence题目大意:求两个字符串的最长公共子序列。解题思路:套公式。#include #include const int N = 1005;int max(const int& a, const int& b) { return a > b ? a : b; }char a[N],原创 2013-09-03 22:17:57 · 1085 阅读 · 0 评论 -
uva 111 History Grading(LCS)
题目连接:111 - History Grading题目大意:给出一个n 代表序列中元素的个数, 然后是一个答案, 接下来是若干个同学的答案(直到文件结束为止), 求出两个序列的最长公共子序列, 注意给出的答案均是以该事件处于第几个发生的, 例如 :2 3 4 1即是 对应第1个事件在第2个发生,第2个事件在第3个发生 ...转换一下就是 4 1 2 3。解题思路原创 2013-09-03 22:06:28 · 1707 阅读 · 0 评论 -
uva 10069 Distinct Subsequences(高精度 + DP求解子串个数)
题目连接:10069 - Distinct Subsequences题目大意:给出两个字符串x (lenth 解题思路:二维数组DP, 有类似于求解最长公共子序列, cnt[i][j]表示在x的前j个字符中有多少个z 前i个字符。状态转移方程 1、x[j] != z[i] cnt[i][j] = cnt[i][j - 1];2、x[j原创 2013-09-05 15:20:15 · 1833 阅读 · 0 评论 -
uva 10066 - The Twin Towers(LCS)
10066 - The Twin Towers题目大意:求给出的两个数组的最长公共子序列,解题思路:dp状态转移方程。#include #include const int N = 1005;int max(const int& a, const int& b) { return a > b ? a : b; }int n, m, dp[N][N],原创 2013-09-03 22:28:43 · 1095 阅读 · 0 评论 -
uva 11081 - Strings(LCS)
题目链接:11081 - Strings题目大意:给出三个字符串,从分别从第一个字符串和第二个字符串中挑选子串a,b,用a和b组成第三个字符串的子串c,问可组成的子串有多少种。#include #include const int N = 70;const int tmp = 10007;int dp[N][N][N], dp1[N][N][N], dp2[N原创 2013-09-25 23:58:17 · 1931 阅读 · 0 评论 -
uva 10534 Wavio Sequence(LIS)
题目连接:10534 - Wavio Sequence题目大意:给出一个字符串, 找出一个奇数的子序列,子序列的前版部分要递增, 后半部分要递减, 且递增和递减的长度要相等, 要求输出最长满足条件的子序列的长度。解题思路:题目可以转化成求字符串的最长递增子序列, 正向求一遍, 反向求一遍, 然后将相应位置的最长值取最小的进行比较(min(a[i], b[n - i - 1]原创 2013-09-10 23:04:52 · 1346 阅读 · 2 评论 -
hdu 5532 Almost Sorted Array(LIS)
题目链接:hdu 5532 Almost Sorted Array解题思路LIS大于n-1即可。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1e5 + 5;struct Stack { int n, s[maxn]; void init原创 2015-11-02 10:33:40 · 1096 阅读 · 0 评论