2012年湖南省第八届程序设计大赛 J 病毒(最长上升公共子序列)

来源:互联网 发布:问卷星可以分析数据吗 编辑:程序博客网 时间:2024/05/17 18:19

这题和hdu 1423是一样的, 求最大上升公共子序列

设dp[i][j]为a序列前i个元素和b序列中前i个元素构成的以b[j]为结尾的最大上升公共子序列

if(a[i]!= b[j])

dp[i][j]= dp[i-1][j]

else if(a[i]== b[j])

dp[i][j]= max(dp[i-1][k]) + 1  (1<= k <=j && b[k]< b[j])

最大上升公共子序列详解:

http://wenku.baidu.com/link?url=3sU6f425-IEdqZz1aEcN5-J3EIzzRTprDT1glV_DkZMW6DmN60nLxfUl-WeeUEuxuY_M-WlNhJNabu8Dc_SeO_NZZVeGfkuX3hpZ-CrgM_S

 

代码:

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxn 1111#define maxm 111111int a[maxn], b[maxn], d[maxn];int main(){//freopen("C:\\Users\\Monkey\\Desktop\\in.txt","r",stdin);int T;scanf("%d",&T);while(T--){int n, m;scanf("%d",&n);for(int i= 1; i<= n; i++)scanf("%d",&a[i]);scanf("%d",&m);for(int i= 1; i<= m; i++)scanf("%d",&b[i]);memset(d, 0, sizeof(d));for(int i= 1; i<= n; i++){int max= 0;for(int j= 1; j<= m; j++){if(a[i]> b[j] && d[j]> max)max= d[j];if(a[i]== b[j])d[j]= max+ 1;}}int ans= 0;for(int i= 1; i<= m; i++)if(d[i]> ans)ans= d[i];printf("%d\n",ans);}return 0;}


 

0 0
原创粉丝点击