POJ1159 Palindrome(數位DP)

Palindrome
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 58277   Accepted: 20221

Descriptionhtml

A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inserted into the string in order to obtain a palindrome. 

As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome. 

Inputgit

Your program is to read from standard input. The first line contains one integer: the length of the input string N, 3 <= N <= 5000. The second line contains one string with length N. The string is formed from uppercase letters from 'A' to 'Z', lowercase letters from 'a' to 'z' and digits from '0' to '9'. Uppercase and lowercase letters are to be considered distinct.

Outputide

Your program is to write to standard output. The first line contains one integer, which is the desired minimal number.

Sample Inputspa

5
Ab3bd

Sample Outputcode

2

Sourceorm

 
分析:

1.當S1==Sn時(字符串頭字符和字符串尾部字符相等時),咱們的任務便轉換爲了將S2,S3,S4……S(n-1)變成迴文,對嗎?htm

2.當S1!=Sn時,咱們又有了兩種決策blog

第一種決策:在字符串序列S1,S2,S3……Sn 的左邊添加一個字符,咱們設這個字符爲Si,使它等於Sn,這樣咱們就將當前的任務轉化爲了將S1,S2,S3……S(n-1)變成迴文字符串。ip

第二種決策:在字符串序列S1,S2,S3……Sn 的右邊添加一個字符,咱們設這個字符爲Sk,使他等於S1,這樣咱們就將當前的任務轉化爲了將S2,S3,S4……Sn變成迴文字符串。字符串

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[5001];
short int  dp[5001][5001];
int dfs(int l, int r)
{
    
    //printf("%d %d\n", l, r);
    if(l >= r)
        return 0;
    int m = 999999;
    if(dp[l][r] != -1)
        return dp[l][r];
    if(s[l] == s[r])
        m = min(dfs(l+1, r-1), m);
    else
    {
        m = min(dfs(l+1,r)+1, m);
        m = min(dfs(l, r-1)+1,m);
    }
    dp[l][r] = m;
    return m;
}
int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        memset(dp, -1, sizeof dp);
        scanf("%s", s);
        int len = strlen(s);
        int ans = dfs(0, len-1);
        printf("%d\n", ans);
    }
    return 0;
}
相關文章
相關標籤/搜索