Nyoj 760 See LCS again [Lcs]
2014-08-05 09:52
260 查看
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=760
题目的意思很是简单, 就是数据比较大。如果用一般的dp来解决的话,一定会是爆内存,爆时间的。所以,这题转化为最长单调递增子序列来求解。
将一个序列中的元素换为领一个序列中的出现相同的元素的下表。比如:
1 2 3 4 5
1 3 5 -> 1 3 5(上个序列的下标).
求最长单调递增子序列就好。。
Code:
题目的意思很是简单, 就是数据比较大。如果用一般的dp来解决的话,一定会是爆内存,爆时间的。所以,这题转化为最长单调递增子序列来求解。
将一个序列中的元素换为领一个序列中的出现相同的元素的下表。比如:
1 2 3 4 5
1 3 5 -> 1 3 5(上个序列的下标).
求最长单调递增子序列就好。。
Code:
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int N = 1e5 + 4; int n, m, arr , brr , hash ; int ils(){ brr[1] = arr[1]; int l = 1, r = 1, mid, lenth = 1; for(int i = 2; i <= m; i ++){ l = 1, r = lenth; while(l <= r){ mid = (l + r) / 2; if(brr[mid] >= arr[i]) r = mid - 1; else l = mid + 1; } brr[l] = arr[i]; if(l > lenth) lenth ++; } return lenth; } int main(){ while(~scanf("%d %d", &n, &m)){ memset(hash, -1, sizeof(hash)); for(int i = 1; i <= n; i ++){ int x; scanf("%d", &x); if(hash[x] == -1) hash[x] = i; } bool flag = false; for(int i = 1; i <= m; i ++){ int x; scanf("%d", &x); if(hash[x] != -1) flag = true; arr[i] = hash[x]; } if(!flag) printf("0\n"); else printf("%d\n", ils()); } return 0; }
相关文章推荐
- nyoj 760 See LCS again
- NYOJ 760 See LCS again
- NYOJ760-See LCS again,有技巧的暴力!
- NYOJ 760 See LCS again(基础dp+哈希表)(复习)
- NYOJ 760 - See LCS again(LCS转LIS)
- NYOJ 题目760 See LCS again(LIS求LCS)
- NYOJ - 760 - See LCS again(最长上升子序列O(N(logN)实现)
- NYIST 760 See LCS again
- See LCS again
- NYOJ760又见LCS
- See LCS again
- nyistOJ-See LCS again(二分)
- See LCS again
- See LCS again
- See LCS again 最长递增子序列到最长公共子序列的转化
- ayit See LCS again
- SeeLCSagain
- See LCS again
- nyoj 37 51nod oj 1092 回文字符串 【LCS变形】
- OpenStack Ceilometer 监控项扩展(havana) - Nice to see you once again