POJ-1458 Common Subsequence

POJ-1458 Common Subsequence

题意:

首先对最长子序列有个定义:如果一个字符串a可以由另一个字符串b删去某些元素得到,那么说明a就是b的子序列字符串
现在有两个字符串,请问最长公共子序列是多长?

思路:

状态定义?

需要知道当前两个字符串比较到哪里了 \(\Rightarrow\) 定义 \(f[i][j]\) 字符串 \(a\) 遍历到第 \(i\) 个点,字符串 \(b\) 遍历到第 \(j\) 个点时,该状态的最长公共子序列是多长。

实现:

#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
const int N = 1e3 + 5;
int f[N][N];
int main()
{
    string a, b;
    while (cin >> a >> b)
    {
        a = '0' + a, b = '0' + b;
        for (int i = 1; i < a.size(); i++)
            for (int j = 1; j < b.size(); j++)
                f[i][j] = 0;

        for (int i = 1; i < a.size(); i++)
            for (int j = 1; j < b.size(); j++)
            {
                if (a[i] == b[j])
                    f[i][j] = f[i - 1][j - 1] + 1;
                else
                    f[i][j] = max(f[i - 1][j], f[i][j - 1]);
            }

        printf("%d\n", f[a.size() - 1][b.size() - 1]);
    }
    return 0;
}
posted @ 2022-12-22 00:46  zxr000  阅读(25)  评论(0编辑  收藏  举报