POJ 2806 公共子序列 解题报告

POJ 2806 公共子序列 解题报告

编号:2806

 

考查点:动态规划

 

思路:仍然是找状态转移,如果str1i位置和str2j位置字符相同,则最长公共子序列为str1i-1位置和str2j-1位置的最长公共子序列+1,如果不相同,则等于i-1j位置的最长公共子序列和ij-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

posted @ 2009-02-10 16:07  端木  阅读(611)  评论(0编辑  收藏  举报