uva10635Prince and Princess(LIS)
来源:互联网 发布:sqlserver语法 编辑:程序博客网 时间:2024/06/11 17:13
题目:uva10635Prince and Princess(LIS)
题目大意:求最长相同公共子序列。
解题思路:因为数据很大,62500不能用之前的那种求LIS的做法来做。可以将第一个路线的整数重新排个序(0...p),然后之后的那个路线因为要找相同的最长子序列,所以要将它原来的数字映射成第一条路线新的数字。这样之后就只需要找第二个路线的LIS就可以了。
nlog(n)的LIS算法:
普通的做法在查找的时候,需要for一遍找到比v【i】小的数。
用LIS数组来存放前i个数的最长LIS(top从0开始),那么这样数字有序就可以用二分查找(log(n))。如果v【i】 >LIS[top]的时候,代表可以加上v【i】 构成top + 1长度LIS。所以LIS【++top】 = v【i】, dp【i】 = top + 1;
如果等于的话,说明dp【i】 = top + 1;但是小于的话,需要在LIS找出一个大于等于v【i】的最接近v【i】的数(第k个),说明之前的k个数都是小于v【i】的。那么dp【i】 = k + 1;但是这里的LIS【k】要更新成v【i】。为什么需要这样?因为既然你要取k + 1个长度的递增子序列,之前的k个都是相同的,那么对于第k + 1个呢,应该取越小的越好把,因为这样后面的数字才会有更大的可能接在这个子序列后面,构成更长的子序列。
代码:
#include <cstdio>#include <cstring>const int N = 62505;int dp[N];int v[N];int vis[N];int LIS[N];int p1;int Max (const int a, const int b) { return a > b ? a: b; }int bsearch (int s) {int l = 0;int r = p1;int mid;while (l < r) {mid = l + (r - l) / 2;if (s == LIS[mid])return mid;else if (s > LIS[mid])l = mid + 1;elser = mid;}return l;}int main () {int n, p, q, t;scanf ("%d", &t);for (int cas = 1; cas <= t; cas++) {scanf ("%d%d%d", &n, &p, &q);memset (vis, -1, sizeof (vis));for (int i = 0; i <= p; i++) {scanf ("%d", &v[i]);vis[v[i]] = i;}p1 = -1;int k;int ans = 0;for (int i = 0; i <= q; i++) {scanf ("%d", &v[i]);v[i] = vis[v[i]];if (v[i] == -1)continue;if (p1 == -1) {dp[i] = 1;LIS[++p1] = v[i];} else {if (v[i] > LIS[p1]) {LIS[++p1] = v[i];dp[i] = p1 + 1;} else if (v[i] < LIS[p1]) {k = bsearch (v[i]);dp[i] = k + 1;LIS[k] = v[i];} elsedp[i] = p1 + 1;} ans = Max (ans, dp[i]);}printf ("Case %d: %d\n", cas, ans);}return 0;}
0 0
- uva10635Prince and Princess(LIS)
- UVA10635Prince and Princess(变形的LIS)
- uva_10635_Prince and Princess ( LIS )
- uva_10635 - Prince and Princess(LIS)
- Uva 10635 - Prince and Princess(LIS)
- 10635 - Prince and Princess LCS&LIS
- UVA 10635 Prince and Princess DP LIS
- Uva10635 Prince and Princess(LIS)
- uva 10635 Prince and Princess LIS
- UVA10635 Prince and Princess(LIS)
- uva10635 Prince and Princess LCS 变 lIS
- UVA 10635 Prince and Princess lcs--》lis
- UVa 10635 Prince and Princess 【LIS】
- Uva - 10635 - Prince and Princess(LCS转LIS)
- UVA 10635 Prince and Princess (LCS优化转LIS)
- UVa 10635 Prince and Princess / LCS 转 LIS
- uva 10635 Prince and Princess (将LCS 转化为 LIS)
- uva 10635Prince and Princess (LCS转LIS)
- Mybatis 中在传参时,$ 和# 的区别
- Spring WebSocket教程(二)
- linux
- 【140814】VC++台球游戏源码
- ISelectionSet接口
- uva10635Prince and Princess(LIS)
- 分数转化为小数
- 树-堆结构练习——合并果子之哈夫曼树
- AChartEngine的一点学习心得
- 关于struts2的namespace=“”和namespace=“/”的思考
- 2014-8-13
- poj 2418 Hardwood Species
- 边沿检测与提取,轮廓跟踪
- C++中组合和继承的初始化