hdu1516 字符串编辑距离dp

来源:互联网 发布:python pack_into 编辑:程序博客网 时间:2024/06/05 21:56

wrong answer 无数次,然后把ios::sync_with_stdio(false)删掉,就ac了,至今不知道原因

#include <iostream>#include <algorithm>#include <string>#include <stack>#include <cmath>#include <cstdio>#include <cstring>using namespace std;char source[100], target[100];int dp[100][100];int len1, len2;int solve1(char* source, char* target){    for (int i = 0; i <= len1; ++i)        dp[i][0] = i;    for (int i = 0; i <= len2; ++i)        dp[0][i] = i;    for (int i = 1; i <= len1; ++i)    {        for (int j = 1; j <= len2; ++j)        {            if (source[i - 1] == target[j - 1])                dp[i][j] = dp[i - 1][j - 1];            else            {                int Del = dp[i - 1][j] + 1;                int Rep = dp[i - 1][j - 1] + 1;                int Ins = dp[i][j - 1] + 1;                dp[i][j] = min(Del, min(Rep, Ins));            }        }    }    cout << dp[len1][len2] << endl;    return dp[len1][len2];}bool flag;enum MyEnum{    Del, Rep, Ins, None}op;int main(void){    while (scanf("%s", source) != EOF)    {        scanf("%s", target);        len1 = strlen(source);        len2 = strlen(target);        int ans = solve1(source, target);        for (int i = len1, j = len2, k = 1; k <= ans;)        {            if (i == 0 && j != 0)                op = Ins;            else if (i != 0 && j == 0)                op = Del;            else            {                int t = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1]));                if (t == dp[i][j - 1])                    op = Ins;                if (t == dp[i - 1][j])                    op = Del;                if (t == dp[i - 1][j - 1])                    op = dp[i - 1][j - 1] == dp[i][j] ? None : Rep;     //可以覆盖之前确定的op            }                switch (op)                {                case Del:printf("%d Delete %d\n", k++, i--);                    break;                case Rep:printf("%d Replace %d,%c\n", k++, i--, target[--j]);                    break;                case Ins:printf("%d Insert %d,%c\n", k++, i + 1, target[--j]);                    break;                case None:                    --i, --j;                    break;                default:                    break;                }        }    }    return 0;}
0 0
原创粉丝点击