[XCOJ#1233]MCC同学拒绝重复代码

题目描述

作为程序员,在工程中需要掌握的技能之一,就是避免代码的重复。  MCC同学开发了一套自动检测重复代码的软件,现在就剩下算法部分未完成了。  我们要求给出两个文件的内容,通过计算其中“最长公共子序列”的长度,来计算其代码重复度。  通过MCC牌黑科技,我们将文件的内容变成了一个整数数组,来便于进行比较。

输入

第一行两个整数n和m 第二行,第三行分别有n,m个整数,表示文件内容。 保证n,m<6000,保证文件内容数字<10000

输出

输出一行整数,表示最长公共子序列的长度。

样例输入

5 7
1 0 2 0 2
2 1 1 1 2 0 0

样例输出

3

这是一个较经典的DP问题。

下面是代码:

#include <iostream>
using namespace std;


int main(void)
{
#ifndef ONLINE_JUDGE 
 freopen("in.txt", "r", stdin);
#endif
 int n, m;
 while (cin >> n >> m)
 {
  int dn[6001], dm[6001];
  short dp[2][6001];
  for (int i = 1; i <= n; i++)
   cin >> dn[i];
  for (int i = 1; i <= m; i++)
   cin >> dm[i];
  for (int i = 0; i < m; i++)
   dp[0][i] = 0;
  int max = 0;
  for (int i = 1; i <= n; i++)
   for (int j = 1; j <= m; j++)
   {
    dp[i % 2][j] = (dp[(i - 1) % 2][j] > dp[i % 2][(j - 1)] ? dp[(i - 1) % 2][j] : dp[i % 2][(j - 1)]);
    if (dn[i] == dm[j])
    {
     dp[i % 2][j] = (dp[(i - 1) % 2][(j - 1)] + 1 > dp[i % 2][j] ? dp[(i - 1) % 2][(j - 1)] + 1 : dp[i % 2][j]);
     max = max > dp[i % 2][j] ? max : dp[i % 2][j];
    }

   }
  cout << max << endl;
 }
 return 0;
}

0 条评论
发表一条评论