CSU1120-病毒-DP/LCS/LIS
2017-06-27 00:47
344 查看
G: 病毒
Description
你有一个日志文件,里面记录着各种系统事件的详细信息。自然的,事件的时间戳按照严格递增顺序排列(不会有两个事件在完全相同的时刻发生)。遗憾的是,你的系统被病毒感染了,日志文件中混入了病毒生成的随机伪事件(但真实事件的相对顺序保持不变)。备份的日志文件也被感染了,但由于病毒采用的随机感染方法,主日志文件和备份日志文件在感染后可能会变得不一样。
给出被感染的主日志和备份日志,求真实事件序列的最长可能长度。
Input
输入第一行为数据组数T (T<=100)。每组数据包含两行,分别描述感染后的主日志和备份日志。每个日志文件的格式相同,均为一个整数n (1<=n<=1000)(代表感染后的事件总数)和n 个不超过100,000的正整数(表示感染后各事件的时间戳)。
注意,感染后可能会出现时间戳完全相同的事件。
Output
对于每组数据,输出真实事件序列的最长可能长度。Sample Input
1 9 1 4 2 6 3 8 5 9 1 6 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 **********************************************************************/
相关文章推荐
- CSU 1120 病毒(dp最长公共序列)
- CSU 1120 病毒(DP)
- csu 1120 病毒(DP,LCIS)
- LIS&LCS 线性结构dp
- CSU 1120 病毒
- CSU 1120 病毒(最长公共递增子序列LICS)
- CSU 1120 病毒(LCIS)
- CSU_1120_病毒
- CSU 1120 病毒(最长公共递增子序列LICS)
- 算法(一) --DP动态规划(LIS和LCS)
- [DP]LIS+LCS+最大连续子段和
- csuoj 1120: 病毒
- CSU 1120 病毒 最长公共递增子序列
- CSU 1120 病毒(最长公共递增子序列LICS)
- CSU 1120 病毒
- CSU 1120 病毒(最长公共递增子序列LICS)
- J - 病毒 CSU - 1120
- CSU 1120 病毒 最长公共上升子序列(LCIS)
- CSU 1120 病毒(最长公共递增子序列LICS)
- UVA 10635 - Prince and Princess (LCS转成LIS DP)