CSU1120-病毒-DP/LCS/LIS
来源:互联网 发布:针织短款开衫淘宝网 编辑:程序博客网 时间:2024/06/02 03:36
G: 病毒
Description
你有一个日志文件,里面记录着各种系统事件的详细信息。自然的,事件的时间戳按照严格递增顺序排列(不会有两个事件在完全相同的时刻发生)。
遗憾的是,你的系统被病毒感染了,日志文件中混入了病毒生成的随机伪事件(但真实事件的相对顺序保持不变)。备份的日志文件也被感染了,但由于病毒采用的随机感染方法,主日志文件和备份日志文件在感染后可能会变得不一样。
给出被感染的主日志和备份日志,求真实事件序列的最长可能长度。
Input
输入第一行为数据组数T (T<=100)。每组数据包含两行,分别描述感染后的主日志和备份日志。
每个日志文件的格式相同,均为一个整数n (1<=n<=1000)(代表感染后的事件总数)和n 个不超过100,000的正整数(表示感染后各事件的时间戳)。
注意,感染后可能会出现时间戳完全相同的事件。
Output
对于每组数据,输出真实事件序列的最长可能长度。
Sample Input
19 1 4 2 6 3 8 5 9 16 2 7 6 3 5 1
Sample Output
3
Hint
这个题太明显了
先找一次LCS然后找最长上升子序列?不不不那样的话程序写起来贼麻烦
你只需要在找LCS的时候保证上升就好
#include <bits/stdc++.h>#define N 1010#define INF 0x3f3f3f3f#define LL long long#define mem(a,n) memset(a,n,sizeof(a))#define fread freopen("in.txt","r",stdin)#define fwrite freopen("out.txt","w",stdout)using namespace std;//int mp[1010][1010],arr1[1010],arr2[1010],dp[1010];愚蠢的做法的痕迹╭(╯^╰)╮//pair<int,int> path[1010][1010];//int main()//{// ios::sync_with_stdio(false);// int t,n1,n2,x,y;// vector<int> ans;// cin>>t;// path[1][1].first=0,path[1][1].second=0;// while(t--){// ans.clear();// cin>>n1;// for(int i=1;i<=n1;++i){// cin>>arr1[i];// }// cin>>n2;// for(int i=1;i<=n2;++i){// cin>>arr2[i];// }// for(int i=0;i<=n1||i<=n2;++i){// mp[i][0]=mp[0][i]=0;// }// for(int i=1;i<=n1;++i){// for(int j=1;j<=n2;++j){// if(arr1[i]==arr2[j]){// mp[i][j]=mp[i-1][j-1]+1;// path[i][j].first=i-1;// path[i][j].second=j-1;// }else{// if(mp[i][j-1]>mp[i-1][j]){// mp[i][j]=mp[i][j-1];// path[i][j].first=i;// path[i][j].second=j-1;// }else{// mp[i][j]=mp[i-1][j];// path[i][j].first=i-1;// path[i][j].second=j;// }// }// }// }// int tempx,tempy;// x=n1,y=n2;// while(x!=0&&y!=0){// tempx=path[x][y].first,tempy=path[x][y].second;// if(mp[x][y]!=mp[tempx][tempy]){// ans.push_back(arr1[x]);// }// x=tempx,y=tempy;// }// for(int i=0;i<ans.size();++i){// cout<<ans[i]<<' ';// dp[i]=1;// }// int m,ma=0;// for(int i=1;i<ans.size();++i){// m=0;// for(int j=0;j<i;++j){// if(ans[i]>ans[j]&&dp[j]>m){// m=dp[j];// }// }// dp[i]=m+1;// if(dp[i]>ma){// ma=dp[i];// }// }// for(int i=0;i<ans.size();++i){// if(dp[i]>m){// m=dp[i];// }// cout<<dp[i]<<' ';// }// cout<<m<<endl;// }// return 0;//}int arr1[N],arr2[N],dp[N];int main(){ ios::sync_with_stdio(false); int n,m,t; cin>>t; while(t--){ cin>>n; for(int i=1;i<=n;++i){ cin>>arr1[i]; } cin>>m; for(int i=1;i<=m;++i){ cin>>arr2[i]; } mem(dp,0); int MAX; for(int i=1;i<=n;++i){ MAX=0; for(int j=1;j<=m;++j){ if(arr1[i]>arr2[j]&&MAX<dp[j]){ MAX=dp[j]; } if(arr1[i]==arr2[j]){ dp[j]=MAX+1; } } } MAX=0; for(int i=1;i<=m;++i){ if(dp[i]>MAX){ MAX=dp[i]; } } cout<<MAX<<endl; } return 0;}/********************************************************************** Problem: 1120 User: CSUzick Language: C++ Result: AC Time:228 ms Memory:1700 kb**********************************************************************/
阅读全文
0 0
- CSU1120-病毒-DP/LCS/LIS
- CSU1120:病毒(LICS)
- 初识dp(LCS,LIS)JAVA版
- AHOI 基因匹配 dp LCS LIS
- 最长公共上升子序列 csu1120 病毒
- LCS && LIS
- LIS+LCS~
- LCS?LIS
- LIS&&LCS
- UVA 10635 - Prince and Princess (LCS转成LIS DP)
- [DP]LIS+LCS+最大连续子段和
- 算法(一) --DP动态规划(LIS和LCS)
- LIS,LCS,一道LIS题
- 【DP算法篇之初学】LIS\LCS\二维DP\带条件DP
- LCS/LIS/LCIS
- 动态规划 LCS,LIS
- lis lcs 复杂度
- LCS与LIS
- CSU1060-Nearest Sequence-DP/LCS
- CSU1081-集训队分组-BFS
- 主成分分析(PCA)原理详解
- CSU1092-Barricade-最短路/Dijkstra
- myEclipse 中修改 jsp 文件默认pageEncoding
- CSU1120-病毒-DP/LCS/LIS
- hadoop的mapreduce作业中出现Java heap space,你认为该如何解决?
- 第三学期第六次算法练习题
- CSU1216-异或最大值-0-1Trie树
- Base.js 库 实现 JS 的对象化编程
- 《统计学习方法》第1章 课后题答案
- CSU1225-ACM小组的队列-DP/LCS加强
- 使用GIT进行硬件版本控制
- 冒泡排序