hdu1159 题目要求两个字符串最长公共子序列,

状态转换方程   f[i][j]=f[i-1][j-1]+1; a[i]=b[j]时

       f[i][j]=MAX{f[i-1][j],f[i][j-1]}  a[i]!=b[j]时

f[i][j]记录a字符串 i 前子串 与 b字符串 j 前子串最长公共子序列  初始化后,自底向上,逐步求解   

动态规划的思想没有搞清楚,递归超时。。犯了很低级的错误

动态规划尽可能地减少重复运算,记忆化搜索很关键

正确代码:

#include<iostream>
#include<string>
#define MAX(a,b) ((a)>(b)?(a):(b))
using namespace std;
char a[1001],b[1001];
int f[1000][1000];
int re;
int main()
{
    int lena, lenb,i,j,re;
    while(scanf("%s%s", a,b)!=EOF)
    {
            lena=strlen(a);
            lenb=strlen(b);
            for(i=0; i<=lena; i++)
            f[i][0]=0;
            for(j=0; j<=lenb; j++)
            f[0][j]=0;
            for(i=1; i<=lena; i++)
            for(j=1;j<=lenb; j++)
            if(a[i-1]==b[j-1])f[i][j]=f[i-1][j-1]+1;
            else
            f[i][j]=MAX(f[i-1][j],f[i][j-1]);
            cout<<f[lena][lenb]<<endl;                
    }return 0;
}

 

 

递归超时代码贴在这里,给自己警示一下!!!!!!

#include<iostream>
#include<string>
#define MAX(a,b) ((a)>(b)?(a):(b))
using namespace std;
string a,b;
int final(int la, int lb, int re)
{
    if(la<0 || lb<0)return re;
    if(a[la]==b[lb]) re=final(la-1,lb-1,re+1);
    else
        re=MAX(final(la-1,lb,re),final(la,lb-1,re));

    return re;
}
int main()
{

    int lena, lenb;
    while(cin >> a >> b)
    {
            lena=a.length();
            lenb= b.length();
            cout<<final(lena-1,lenb-1,0)<<endl;                
    }return 0;
}

  先前wa了的代码,求测试数据,顺便贴过来,回来有空再回来瞅瞅。。现在有点乱了

#include<iostream>
#include<string>
#define find(c,n) find_first_of(c,n)
#define MAX(a,b) ((a)>(b)?(a):(b))
using namespace std;
int d[10000];
int re[10000];
int main()
{
    string a,b;
    int i,j,k,p,len,max,num[27];

    while(cin >> a >> b)
    {
    //cin >> a >> b;
    memset(d,0,sizeof(d));
    memset(re,0,sizeof(re));
    memset(num,0,sizeof(num));
    len = b.length();
    for (i=0; i<len; i++)
    //cout <<a.find_first_of(b[i],0)<<endl;
    {
           k=b[i]-'a';
           p=a.find(b[i],num[k]);
           if(p==string::npos)
           d[i]=-1;
           else d[i]=p,num[k]=p+1;
    }
    //for(i=0;i<len; i++)cout << d[i] << " ";cout <<endl;
    for(i=0;i<len; i++)if(d[i!=-1])re[i]=1;
    for(i=0; i<len; i++ )
    {
         if(d[i]==0){re[i]=1;continue;};    
         int  f=0;
         for(j=i-1;j>=0 ;j--)
         if(d[i]>d[j])re[i]=MAX(re[i],re[j]+1),f=1;
         if(!f)re[i]=0;
         
    }
    //for(i=0;i<len; i++)cout << re[i] << " ";cout <<endl;     
    max=re[0];
    for(i=1; i<len; i++)
    max=MAX(max,re[i]);
    cout << max << endl;     
    }return 0;      
}