InputInput contains multiple cases. Each case consists of two lines:
The first line contains string A.
The second line contains string B.
The length of both strings will not be greater than 100.
OutputA single line contains one integer representing the answer.Sample Input
zzzzzfzzzzz abcdefedcba abababababab cdcdcdcdcdcd
Sample Output
6 7
区间dp,但是具体实现,没实现,参考了一下题解:链接:https://blog.csdn.net/martinue/article/details/45953229
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<set> #include<map> #include<vector> #include<cmath> const int maxn=1e5+5; typedef long long ll; using namespace std; int a[105],dp[105][105]; char s1[105],s2[105]; int solve(int i,int j) { if(dp[i][j]!=-1) return dp[i][j]; if(i>j) return dp[i][j]=0; if(i==j) return dp[i][j]=1; dp[i][j]=solve(i+1,j)+1; for(int k=i+1;k<=j;k++) if(s2[k]==s2[i]) dp[i][j]=min(solve(i+1,k)+solve(k+1,j),dp[i][j]); return dp[i][j]; } int main () { while(cin>>s1>>s2) { memset(dp,-1,sizeof(dp));memset(a,0,sizeof(a)); int len =strlen(s1); for(int i=0;i<len;i++) { for(int j=i;j<len;j++) int t=solve(i,j); } for(int i=0;i<len;i++) { a[i]=dp[0][i]; if(s1[i]==s2[i]) { if(i==0) a[i]=0; else a[i]=a[i-1]; } else { for(int j=0;j<i;j++) a[i]=min(a[i],a[j]+dp[j+1][i]); } } printf("%d\n",a[len-1]); } return 0; }