1. 程式人生 > >51 Nod 1092 迴文字串

51 Nod 1092 迴文字串

基準時間限制:1 秒 空間限制:131072 KB 分值: 10 難度:2級演算法題

 收藏

 關注

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

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

Input

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

Output

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

Input示例

abbc

Output示例

2

思路:

最壞的情況就是在原字串的右邊新增該字串的倒序字串咯,長度為a.size(),不難想到原字串和其倒序字串可能存在公共子序列,公共子序列含有的字元我們是不需要新增的(因為兩邊原本就有嘛).我們要使新增的字元最少,那麼就是找到最大的公共子序列,再用a.size()減去公共子序列含有的字元數目就好啦,即:

ans=a.size()-lcs(a, b), 其中b為a的倒序字串;

#include <bits/stdc++.h> #define MAXN 1010 using namespace std;

int dp[MAXN][MAXN];

int main(void){     string a, b;     cin >> a;     b=a;     reverse(b.begin(), b.end());     int len=a.size();     for(int i=0; i<len; i++){         for(int j=0; j<len; j++){             if(a[i]==b[j]){                 dp[i+1][j+1]=dp[i][j]+1;             }else{                 dp[i+1][j+1]=max(dp[i+1][j], dp[i][j+1]);             }         }     }     cout << len-dp[len][len] << endl; }