dp专题 第四题 最长公共子序列

来源:互联网 发布:电子科技大学软件学院 编辑:程序博客网 时间:2024/05/19 07:41

1、简单描述

多次测试输入,输入两个字符串,编号是上升序列,查找他们最长公共子序列的长度。

2、思路

# include <bits/stdc++.h>
using namespace std;
int main()
{
    string s1,s2;
    while(cin>>s1>>s2)
    {


        int arr[1001][1001];
        memset(arr,0,sizeof arr);
        for(int i=1;i<=s1.size();i++)
        {
            for(int j=1;j<=s2.size();j++)
            {
                if(s1[i-1]==s2[j-1])
                {
                    arr[i][j]=arr[i-1][j-1]+1;
                }
                else
                {
                    arr[i][j]=max(arr[i][j-1],arr[i-1][j]);
                }
            }
        }
        cout<<arr[s1.size()][s2.size()]<<endl;
    }
    return 0;
}

1、寻找子问题    arr二维数组前i个元素,前j个元素查找最长公共子列

2、定义状态  每个状态结果与i、j有关,用二维数组描述状态,将子问题转化为只考虑前i个元素和前j个元素的决策。

3、找状态转移方程

如果s1第i个元素与s2第j个元素相同,结果为arr【i-1】【j-1】+1;

如果不相同,相当于s1第i个元素或者s2第j个元素不起作用,结果为arr【i-1】【j】和arr【i】【j-1】中较大的值。

4、自下向上寻求最优解。

0 0
原创粉丝点击