nyoj 36

最长公共子序列

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述
咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。
tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。


输入
第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000.
输出
每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
样例输入

2asdfadfsd123abcabc123abc

样例输出

36


要计算这道题,需要使用动态规划,对每个字符串的2个字符进行比较。如果相同,最长的长度加1,否则取临近最大的值。
代码粘上:
#include <iostream>
#include <string>
using namespace std;
int max(int i,int j);
int main()
{
 int k;
 cin >> k;
 while (k--)
 {
  string s1, s2;
  int i, j;
  int a, b;
  int dp[1001][1001] = { 0 };
  cin >> s1 >> s2;
  a = s1.length();
  b = s2.length();
  for (i = 1; i <= a; i++)
   for (j = 1; j <= b; j++)
   {
    if (s1[i - 1] == s2[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 << dp[a][b] << endl;
 }
}
int max(int i, int j)
{
 return i > j ? i : j;
}

你可能感兴趣的:(动态规划,南阳理工acm)