UVA10723 Cyborg genes (LCS)

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19469

題意:給你兩個字符串,問你最短的能將這兩個字符串作爲子序列的序列的長度與數量。

分析:標準的LCS題,兩個字符串長度和減去LCS長度即可。

#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
#define INF 0x3f3f3f3f
const int N=10005;
const int mod=1e9+7;

int d[35][35];
long long s[35][35];
string s1,s2;

int main() {
    int t;
    cin>>t;
    getchar();
    int kase=0;
    while (t--) {
        kase++;
        getline(cin, s1);
        getline(cin, s2);
        memset(d, 0, sizeof(d));
        memset(s, 0, sizeof(s));
        int len1=s1.length(),len2=s2.length();
        for (int i=0; i<=len1; i++) {
            s[i][0]=1;
        }
        for (int i=0; i<=len2; i++) {
            s[0][i]=1;
        }
        for (int i=1; i<=len1; i++) {
            for (int j=1; j<=len2; j++) {
                if (s1[i-1]==s2[j-1]) {
                    d[i][j]=d[i-1][j-1]+1;
                    s[i][j]=s[i-1][j-1];
                } else {
                    if (d[i-1][j]>d[i][j-1]) {
                        d[i][j]=d[i-1][j];
                        s[i][j]=s[i-1][j];
                    } else if (d[i-1][j]<d[i][j-1]) {
                        d[i][j]=d[i][j-1];
                        s[i][j]=s[i][j-1];
                    } else {
                        d[i][j]=d[i-1][j];
                        s[i][j]=s[i-1][j]+s[i][j-1];
                    }
                }
            }
        }
        printf("Case #%d: %d %lld\n",kase,len1+len2-d[len1][len2],s[len1][len2]);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章