poj-2250-LCS+输出路径

这个题思路很明显,就是将字符串每个单词处理为一个元素,然后进行LCS求解,再打印路径就好。

问题在于输出路径,这里我写的是直接逆序寻找路径,比较好写,还有一种是dp时就进行记录的,那个个人觉得很麻烦,就不写了。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <set>
#include <algorithm>

using namespace std;

string s;
vector<string> vt1,vt2;
int dp[105][105];

int main()
{
    int num=0;
    while(cin >> s)
    {
        if(s[0]=='#') num++;
        if(num==0)
            vt1.push_back(s);
        if(num==1)
            vt2.push_back(s);
        if(num==2)
        {
            memset(dp,0,sizeof(dp));
            for(int i=0; i<vt1.size(); i++)//这一段大家不要看了,存的有点乱
            {
                for(int j=0; j<vt2.size(); j++)
                {
                    if(vt1[i]==vt2[j])
                        dp[i+1][j+1]=max(dp[i+1][j+1],dp[i-1+1][j-1+1]+1);
                    else
                        dp[i+1][j+1]=max(dp[i-1+1][j+1],dp[i+1][j-1+1]);
                }
            }
            vector<string> ans;
            int len1=vt1.size(),len2=vt2.size();
            int cal=dp[len1][len2],l=len2-1;//设置cal为最大长度,即路径长度,l是标记查找到的位置,为了避免重复查找
            for(int i=len1-1;i>=0;i--)//逆序查找路径
            {
                for(int j=l;j>=0;j--)
                {
                    if(dp[i+1][j+1]==cal && vt1[i]==vt2[j])//路径的条件,除了对应元素相同,而且长度值也要符合
                    {
                        cal--;
                        l=j-1;
                        ans.push_back(vt1[i]);
                        break;
                    }
                }
            }
            for(int i=ans.size()-1;i>=0;i--)//输出路径
            {
                if(i==0) cout << ans[i] <<endl;
                else cout << ans[i] << " ";
            }
            vt1.clear();
            vt2.clear();
            num=0;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/alusang/article/details/81208904