题意:用刷子把a串刷成b串;
题解:说实话我想不出来,看了别人的博客, 是先做用空串刷成b, 然后拿a和b做对比;大概是这么做,具体看代码注释;(感受到了分部做的强大);
代码:
#include <iostream>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 108;
int dp[MAXN][MAXN], ans[MAXN];
char a[MAXN], b[MAXN];
int main() {
while (~scanf("%s%s", a, b)) {
int ll = strlen(a);
//第一部分第一种方法
for(int i = 0; i < ll; i++) {
for(int j = 0; j < ll-i; j++) {
int jj = i+j;
dp[j][jj] = dp[j+1][jj]+1;
for(int k = j+1; k <= jj; k++)
if (b[j] == b[k])
dp[j][jj] = min(dp[j][jj], dp[j+1][k]+dp[k+1][jj]);
//说实话我还没完全理解,大概意思就是如果两个地方相等刷一个地方
//时,可以顺便将另一个地方也刷掉,也可以这样写;
// dp[j][jj] = min(dp[j][jj], dp[j+1][k-1]+dp[k][jj]);
}
}
//第二种方法(别人都这样写)
for(int i = ll-1; i >= 0; i--) {
for (int j = i; j < ll; j++) {
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 < ll; i++) {
ans[i] = dp[0][i];
if (a[i] == b[i]) {//i这个点可以不刷
if (i == 0)
ans[i] = 0;
else ans[i] = ans[i-1];
}
else {
for(int j = 0; j < i; j++)
ans[i] = min(ans[i], ans[j]+dp[j+1][i]);
}
}
printf("%d\n", ans[ll-1]);
}
return 0;
}