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; }