转自:http://blog.youkuaiyun.com/libin56842/article/details/9708807
还是看不懂。。dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]); 为什么是这公式
#include<bits/stdc++.h>
using namespace std;
#define bug1 printf("bug1\n");
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
#define inf 0x3f3f3f3f
const int maxn=105;
int res[maxn];
int dp[maxn][maxn];
int main(){
string a,b;
while(cin>>a>>b){
int len=a.length();
mem(dp,0);
for(int j=0;j<len;++j){
for(int i=j;i>=0;i--){
dp[i][j]=dp[i+1][j]+1;
for(int k=i+1;k<=j;++k){
if(b[i]==b[k])
dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
}
}
}
/*
for(int s=0;s<=len;++s){
for(int i=0;i+s<len;++i){
int j=i+s;
dp[i][j]=dp[i+1][j]+1;
for(int k=i+1;k<=j;++k){
if(b[i]==b[k]){
dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
}
}
}
}*/
for(int i=0;i<len;++i){
res[i]=dp[0][i];
}
for(int i=0;i<len;++i){
if(a[i]==b[i]){
res[i]=res[i-1];
}
else{
for(int j=0;j<i;++j){
res[i]=min(res[i],res[j]+dp[j+1][i]);
}
}
}
pf("%d\n",res[len-1]);
}
}