您的位置:首页 > 其它

UVa 10066 - The Twin Towers

2014-03-12 19:45 405 查看
题目链接:UVa 10066 - The Twin Towers

简单LCS,讲解看这里

顺带写了打印函数,题目没有要求。

#include <iostream>

using namespace std;

const int MAX_N = 100 + 10;
int n1,n2;
int arr1[MAX_N],arr2[MAX_N];
int dp[MAX_N][MAX_N];

void print()
{
    int i = n1;
    int j = n2;
    int k = dp[i][j];
    char lcs[MAX_N] = {'\0'};  //全部初始化为'\0',打印字符或者数字时候都可以用这个
    //int lcs[MAX_N];  //打印数字时候可以用这个
    while(i && j)
    {
        if(arr1[i-1] == arr2[j-1])
        {
            lcs[--k] = arr1[i-1] + '0';
            --i; --j;
        }
        else if(dp[i][j-1] > dp[i-1][j])
            --j;
        else
            --i;
    }
    for(i = 0;i < dp[n1][n2] - 1;i++)
        cout << lcs[i] - '0' << " ";
    cout << lcs[dp[n1][n2] - 1] - '0'<< endl;
    //cout << lcs << endl;  //如果是字符可以这么输出
}
int main()
{
    int num = 0;
    while(cin >> n1 >> n2,n1 + n2)
    {
        for(int i = 0;i < n1;i++)
        {
            cin >> arr1[i];
            dp[i][0] = 0;
        }

        for(int i = 0;i < n2;i++)
        {
             cin >> arr2[i];
             dp[0][i] = 0;
        }
        for(int i = 1;i <= n1;i++)
        {
            for(int j = 1;j <= n2;j++)
            {
                if(arr1[i - 1] == arr2[j - 1])
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                else
                    dp[i][j] = max(dp[i - 1][j],dp[i][j - 1]);
            }
        }
        cout << "Twin Towers #" << ++num << endl;
        cout << "Number of Tiles : " << dp[n1][n2] << endl;
        cout << endl;
        print();
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: