51Nod 1092 迴文字串(區間dp)
阿新 • • 發佈:2018-12-24
迴文串是指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; }