题目
源地址:
http://poj.org/problem?id=1458
理解
DP的基础题,求最长子序列(LCS)。 状态转移方程伪代码如下:
if (i == 0 || j == 0)
dp[i,j] = 0
else if (X[i] == Y[j])
dp[i,j] = dp[i-1,j-1] + 1
else
dp[i,j] = max(dp[i-1,j], dp[i,j-1])
代码
#include <iostream>
#include <string>
using namespace std;
const int SIZE = 999;
int dp[SIZE][SIZE] = {0};
int max(int x, int y)
{
return x > y ? x : y;
}
int main(int argc, char const *argv[])
{
int len1, len2;
string str1, str2;
while (cin >> str1 >> str2)
{
len1 = str1.length();
len2 = str2.length();
for (int i = 1; i <= len1; i++)
{
for (int j = 1; j <= len2; j++)
{
if (str1[i - 1] == str2[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[len1][len2] << endl;
}
return 0;
}
更新日志
- 2014年08月12日 已AC。