1. 程式人生 > >51Nod 1092 迴文字串(區間dp)

51Nod 1092 迴文字串(區間dp)

迴文串是指aba、abba、cccbccc、aaaa這種左右對稱的字串。每個字串都可以通過向中間新增一些字元,使之變為迴文字串。

例如:abbc 新增2個字元可以變為 acbbca,也可以新增3個變為 abbcbba。方案1只需要新增2個字元,是所有方案中新增字元數量最少的。

收起

輸入

輸入一個字串Str,Str的長度 <= 1000。

輸出

輸出最少新增多少個字元可以使之變為迴文字串。

輸入樣例

abbc

輸出樣例

2

dp[i][j]二維陣列表示的是從位置i到j所需要新增的最少字元。

 遞推公式:

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

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

else 

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

程式碼如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1005;
char s[maxn];
int dp[maxn][maxn];
int main()
{
    scanf("%s",s);
    int len=strlen(s);
    for (int i=0;i<len;i++)
    {
        dp[i][i]=0;
    }
    for (int i=0;i<len-1;i++)
    {
        if(s[i]==s[i+1])
        {
            dp[i][i+1]=0;
        }
        else
        {
            dp[i][i+1]=1;
        }
    }
    for (int i=2;i<len;i++)
    {
        for (int j=0;i+j<len;j++)
        {
            int k=i+j;
            if(s[j]==s[k])
            {
                dp[j][k]=dp[j+1][k-1];
            }
            else
            {
                dp[j][k]=min(dp[j+1][k],dp[j][k-1])+1;
            }
        }
    }
    printf("%d\n",dp[0][len-1]);
    return 0;
}