UVa 10453 Make Palindrome(Simple DP)

6569 단어 Make
제목:
최소한 몇 개의 문자를 삽입해서 회문 문자열로 만들고 출력하는지 문자열을 지정합니다.
생각:
제목은 이미 사공이 익숙해졌는데, 회문열에 대한 출력은 틀림없이 귀속이다.
#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <algorithm>

using namespace std;



const int MAXN = 1010;

char str[MAXN];

int dp[MAXN][MAXN];



void output(int i, int j)

{

    if (i == j)

        printf("%c", str[i]);

    else if (str[i] == str[j])

    {

        printf("%c", str[i]);

        if (i + 1 <= j - 1)

            output(i + 1, j - 1);

        printf("%c", str[j]);

    }

    else

    {

        if (dp[i+1][j] < dp[i][j-1])

        {

            printf("%c", str[i]);

            output(i + 1, j);

            printf("%c", str[i]);

        }

        else

        {

            printf("%c", str[j]);

            output(i, j - 1);

            printf("%c", str[j]);

        }

    }

}



int main()

{

    while (scanf("%s", str) != EOF)

    {

        int n = strlen(str);

        for (int i = 0; i < n; ++i)

        {

            dp[i][i] = 0;

            if (str[i] == str[i+1])

                dp[i][i+1] = 0;

            else

                dp[i][i+1] = 1;

        }



        for (int p = 2; p < n; ++p)

        {

            for (int i = 0, j = p; j < n; ++i, ++j)

            {

                if (str[i] == str[j])

                    dp[i][j] = dp[i+1][j-1];

                else

                    dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1;

            }

        }

        printf("%d ", dp[0][n-1]);

        output(0, n - 1);

        printf("
"); } return 0; }

좋은 웹페이지 즐겨찾기