这个题目用dp
第一次做题目时候在dp方法中二重循环中,把i和j的初始设置为了1,但是在输入两个字符串的时候,char数组是从开始的,于是在判断
if(str1[i]==str[j])时候出错,应改正为if(str[i-1]==str[j-1])
以下为从网页找到的一张图,侵删。
这个图就是lcs dp的主要思路。当str1[i-1]==str2[j-1]时,dp[i][j] = dp[i-1][j-1]+1;
当str1[i-1]!=str2[j-1]时,dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
下面贴出自己的代码:
#include<iostream>
#include<cstdio>
#include<cstring>
char str1[1005];
char str2[1005];
int ans[1005][1005];
using namespace std;
int max(int a,int b){
return a>b?a:b;
}
int dp(){
int m = strlen(str1);
int n = strlen(str2);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(str1[i-1] == str2[j-1]){ //第一次就是这里写成str1[i]==str2[j]导致结果出错
ans[i][j] = ans[i-1][j-1] + 1;
}
else{
ans[i][j] = max(ans[i][j-1],ans[i-1][j]);
}
}
}
return ans[m][n];
}
int main(){
while(scanf("%s",str1)!=EOF){
scanf("%s",str2);
memset(ans,0,sizeof(ans));
printf("%d\n",dp());
}
}