代码改变世界

杭电ACMsteps 3.2.2 Common Subsequence

2013-11-30 13:54  凝月流风  阅读(284)  评论(0编辑  收藏  举报

   最长公共子序列,动规经典题

   f[i][j] = max {f[i-1][j], f[i][j-1], f[i-1][j-1]+(s1[i] == s2[j])}

   

#include <iostream>
#include <string>
using namespace std;
const int maxn = 1010;
int f[maxn][maxn];
inline int max(int x, int y, int z) {
  if (x > y) return x > z ? x : z;
  else       return y > z ? y : z; 
}
int main()
{
  string s1, s2;
  int i, j;
  while (cin >> s1 >> s2) {
	  int len1 = s1.size();
	  int len2 = s2.size();
	  for (i = 0; i <= len2; i++)
	    f[0][i] = 0;
    for (i = 0; i <= len1; i++)
      f[i][0] = 0;
    for (i = 1; i <= len1; i++) {
		  for (j = 1; j <= len2; j++) {
			  bool tmp = (s1[i-1] == s2[j-1]);
			  f[i][j] = max(f[i-1][j], f[i][j-1], f[i-1][j-1]+tmp);
			}
		}
		cout << f[len1][len2] << endl; 
	}
	return 0;
}