POJ 2806 公共子序列 解题报告
POJ 2806 公共子序列 解题报告
编号:2806
考查点:动态规划
思路:仍然是找状态转移,如果str1的i位置和str2的j位置字符相同,则最长公共子序列为str1的i-1位置和str2的j-1位置的最长公共子序列+1,如果不相同,则等于i-1和j位置的最长公共子序列和i和j-1位置的最长公共子序列两者中的较大值。和最长子序列那道题基本一致,有个问题就是如果写成递归式会TLE.。
提交情况: 轻轻松松写出其递归形式的算法,结果出现了TLE,很尴尬,我一向以为DP就是递归+状态数组.没办法,临时改成二重循环,还好,顺利AC.>
Source Code:
//POJ Grids 2806
#include <string.h>
#include <iostream>
using namespace std;
#define MAX 210
#define OFFSET 1
char str1[MAX];
char str2[MAX];
int len[MAX][MAX];
int main()
{
while (scanf("%s %s",str1,str2)!=EOF)
{
memset(len,0,sizeof len);
for (int i=0;i<MAX;i++)
{
len[0][i] = 0;
len[i][0] = 0;
}
int len1 = strlen(str1);
int len2 = strlen(str2);
for (int i=0;i<len1;i++)
{
for (int j=0;j<len2;j++)
{
if (str1[i]==str2[j])
len[i+OFFSET][j+OFFSET] = len[i-1+OFFSET][j-1+OFFSET]+1;
else
len[i+OFFSET][j+OFFSET] = len[i-1+OFFSET][j+OFFSET] > len[i+OFFSET][j-1+OFFSET] ? len[i-1+OFFSET][j+OFFSET] : len[i+OFFSET][j-1+OFFSET];
}
}
cout<<len[len1][len2]<<endl;
}
return 0;
}
总结:最好使用非递归形式的动态规划算法,递归偶尔会超时.这次还犯了把j写成i的一个小bug,浪费了很长时间.。
By Ns517
Time 09.02.10