ZOJ 3603 DP LCS

已经5年没有做OJ了,

曾经沧海难为水,除去巫山不是云“

准备每周刷1-2题!

题目大意:给出N个字符串,且各个字符串都包含唯一的字母,即不存在“ABCA”(A重复了),而“AFDSG”是正确的。

                 求出N个字符串的公共字母。 最后,按照字典序输出。

分     析:首先对各个字符串进行字典序排序,然后求所有的LCS,做法是两两相求即可。N个字符串,总共求N-1次LCS,就得到最后的结果了。

代     码:

//http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3603
#include<iostream>
#include<stack>
#include<cstdio>
#include<algorithm>
#include<string>
#include<fstream>

using namespace std;

int matrix[14][14];
int f[14][14];

string result = "";
void subSequence(int i, int j, string str)
{
    if (i == 0 || j == 0) return;
    if (f[i][j] == 1)
    {
        result = str[i - 1] + result;
        subSequence(i - 1, j - 1, str);
    }
    else
    {
        if (f[i][j] == 2)
        {
            subSequence(i - 1, j, str);
        }
        else
        {
            subSequence(i, j - 1, str);
        }
    }
}


string LCS(string str1, string str2)
{
    //初始化边界,过滤掉0的情况
    for (int i = 0; i <= str1.size(); i++)
        matrix[i][0] = 0;

    for (int j = 0; j <= str2.size(); j++)
        matrix[0][j] = 0;

    for (int i = 0; i < 22; i++)
    {
        for (int j = 0; j < 22; j++)
        {
            f[i][j] = 0;
        }
    }

    //填充矩阵
    for (int i = 1; i <= str1.size(); i++)
    {
        for (int j = 1; j <= str2.size(); j++)
        {
            if (str1[i - 1] == str2[j - 1])
            {
                matrix[i][j] = matrix[i - 1][j - 1] + 1;
                f[i][j] = 1;
            }
            else
            {
                if (matrix[i - 1][j] >= matrix[i][j - 1])
                {
                    matrix[i][j] = matrix[i - 1][j];
                    f[i][j] = 2;
                }
                else
                {
                    matrix[i][j] = matrix[i][j - 1];
                    f[i][j] = 3;
                }
            }
        }
    }
    result = "";
    subSequence(str1.size(), str2.size(), str1);
    return result;
}


int main()
{
    //fstream cin("3603.txt");
    int T, n;
    cin >> T;
    while (T--)
    {
        cin >> n;
        stack<string> st = stack<string>();
        while (!st.empty())
        {
            st.pop();
        }

        string tmp;
        for (int i = 0; i < n; i++)
        {
            cin >> tmp;
            sort(tmp.begin(), tmp.end());

            if (!st.empty())
            {
                string inner = st.top();
                st.pop();
                st.push(LCS(inner, tmp));
            }
            else
            {
                st.push(tmp);
            }
        }
        cout << st.top() << endl;
    }
    return 0;
}

 

posted @ 2015-03-21 22:45  _DN  阅读(172)  评论(0编辑  收藏  举报