题目

源地址:

http://poj.org/problem?id=1159

理解

最关键的公式是:

if (str[i] == str[j])
    DP[k][j] = DP[1 - k][j - 1];
else
    DP[k][j] = min(DP[1 - k][j], DP[k][j - 1]) + 1;

注意到k空间的循环利用,节省了空间,感谢大牛提供的思路。

代码

#include <iostream>
#include <string.h>
#include <cstdio>
#include <string>

using namespace std;

int DP[2][5003];

int main(int argc, char const *argv[])
{
    int n;
    string str;

    while (scanf("%d", &n) != EOF)
    {
        cin >> str;
        memset(DP, 0, sizeof(DP));

        int k = 0;
        for (int i = n - 2; i >= 0; i--)
        {
            for (int j = i; j < n; j++)
            {
                if (str[i] == str[j])
                    DP[k][j] = DP[1 - k][j - 1];
                else
                    DP[k][j] = min(DP[1 - k][j], DP[k][j - 1]) + 1;
            }
            for (int j = 0; j < n; j++) DP[1 - k][j] = 0;
            k = 1 - k;
        }
        printf("%d\n", DP[1 - k][n - 1]);
    }
    return 0;
}

更新日志

  • 2014年08月12日 已AC。