hdu 2476 String painter

来源:互联网 发布:php抓取网页指定内容 编辑:程序博客网 时间:2024/06/01 10:32

题意:用刷子把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;}