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; }