1. 程式人生 > >最少新增幾個成為迴文字串--nyoj36

最少新增幾個成為迴文字串--nyoj36

描述

所謂迴文字串,就是一個字串,從左到右讀和從右到左讀是完全一樣的,比如"aba"。當然,我們給你的問題不會再簡單到判斷一個字串是不是迴文字串。現在要求你,給你一個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為迴文字串。

輸入

第一行給出整數N(0<N<100)
接下來的N行,每行一個字串,每個字串長度不超過1000.

輸出

每行輸出所需新增的最少字元數

樣例輸入

1
Ab3bd

樣例輸出

2

分析:求出原字串和倒置字串的最長公共序列,然後用字串長度減去這個公共長度即可,而公共序列的求解套用dp模板即可

#include <iostream>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 1000+5;
int ma[maxn],dp[maxn][maxn],n,k;
int main()
{

   string s1,s2;
   cin>>k;
   while(k-->0){
    memset(dp,0,sizeof(dp));
    cin>>s1;
    s2 = s1;
    n = s1.length();
    reverse(s2.begin(),s2.end());
    for(int i = 0;i < n;i++){
      for(int j = 0;j < n;j++){
          if(s1[i] == s2[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<<n-dp[n][n]<<endl;
    }
    return 0;
}