nyoj 36

//这一题是  nyoj 36  是一道求最长公共子序列的题,也是用dp做出来的

核心代码也就是一句,题目大概思路是先找到两组字符串里面相同的字母

在二维数组里面更新每次比较过后dp的值,空想很难理解,自己在纸上画画就知道了

实在不行就把那段代码记下来。。。

还有我一直都不明白为什么我把dp数组放在主函数和while里面

编译不过,而且我一直都怀疑二维数组没赋初值,可以显示初始值,那还要memset干嘛呢。。。。

#include <iostream>
#include <string.h>
#define Max(a,b) a>b?a:b
using namespace std;int dp[1000][1000];
int main()
{
    int i,j,t,len1,len2;
    cin>>t;
    while(t--)
    {
        char a[1000],b[1000];

        cin>>a;
        cin>>b;
        len1=strlen(a);
        len2=strlen(b);
       // for(i=0;i<len1;cout<<endl,i++)
        //    for(j=0;j<len2;j++)
       //     cout<<dp[i][j]<<" ";
        for(i=0;i<len1;i++)
            for(j=0;j<len2;j++)
                dp[i+1][j+1]=((a[i]==b[j])?dp[i][j]+1:Max(dp[i+1][j],dp[i][j+1]));
                cout<<dp[len1][len2]<<endl;
    }
    return 0;
}

posted @ 2014-12-11 14:38  __夜风  阅读(135)  评论(0编辑  收藏  举报