hdu-1423

来源:互联网 发布:苹果cpu测试软件 编辑:程序博客网 时间:2024/06/05 09:16

最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。

这题求的是 公共递增非连续子序列

#include<cstdio>#include<iostream>using namespace std;int main(){    int t,n,m,a[512],b[512],len[512];    while(scanf("%d",&t) != EOF) {          while(t--) {                scanf("%d",&n);                for(int i = 0; i < n; ++i) {                    scanf("%d",&a[i]);                }                scanf("%d",&m);                for(int i = 0; i < m; ++i) {                    scanf("%d",&b[i]);                }                memset(len,0,sizeof(len));                int MAX = 0;                len[0] = -1;                for(int i = 0; i < n; ++i) {                    int k = 0;                    for(int j = 0; j < m; ++j) {                        if(b[j] < a[i] && len[j] > len[k]) {                            k = j;                        }                        if(b[j] == a[i]) {                            len[j] = (len[k] >= 0?len[k]:0)+1;                        }                    }                }                for(int i = 0; i < 512; ++i) {                    if(MAX < len[i]) {                        MAX = len[i];                    }                }                printf("%d\n",MAX);                if(t)                     puts("");           }    }    return 0;}