现在的位置: 首页 > 综合 > 正文

HOJ 10411 字符串的修改

2019年02月13日 ⁄ 综合 ⁄ 共 887字 ⁄ 字号 评论关闭

一道dp上手题。状态转移方程是(来自昊博士课件[Dynamic Programming.ppt])

如果计AiBj是两个字符串的最后字符,计l[i,j]为字符串AiBj最少的修改次数。

显然如果Ai=Bj,l[i,j]=l[i-1,j-1];

否则l[i,j]=min(l[i-1,j],l[i,j-1],l[i-1,j-1])+1;


AC代码:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;

char str1[204], str2[204];
int len1, len2;
int p[204], n[204]; //上一行,当前行
int i, j; //控制str1,str2循环体变量

int main() {
//        freopen("10411.in", "r", stdin);
        str1[0] = '0', str2[0] = '0';

        while (~scanf("%s%s", &str1[1], &str2[1])) {
                len1 = strlen(str1), len1--; //去除str1[0]的干扰
                len2 = strlen(str2), len2--; //去除str2[0]的干扰

                for (j = 0; j <= len2; j++) p[j] = j; //当str1长度为0时
                for (i = 1; i <= len1; i++) {
                        for (j = 0; j <= len2; j++) {
                                if (j == 0) n[j] = i;
                                else {
                                        if (str1[i] == str2[j]) n[j] = p[j-1];
                                        else n[j] = min(min(p[j-1], n[j-1]), p[j]) + 1; //等价于matrix[i][j]=min(min(matrix[i-1][j-1],matrix[i][j-1]),matrix[i-1][j])
                                }
                        }
                        for (j = 0; j <= len2; j++) { //数组滚动
                                p[j] = n[j];
                        }
                }
                printf("%d\n", n[len2]);
        }
        return 0;
}

抱歉!评论已关闭.