南陽理工學院動態規劃專題 迴文字串
阿新 • • 發佈:2019-02-12
這個問題使用動態規劃求解,dp[i][j]表示字串下標為i的字元和下標為j的字元區間內構成迴文所需加入的最少的字串。
當str[i]==str[j]時,則dp[i][j]=dp[i+1][j-1],當str[i]!=str[j]時,dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1),初始化時候,d[i][i]=0,d[i][i+1]=1(這裡真是糾結了一個多小時,我還以為我轉移方程錯了!!!)。輸出dp[0][strlen(str)-1].
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char str[1001]; int dp[1001][1001]; int main() { int cas; cin>>cas; while(cas--) { cin>>str; int l=strlen(str); for(int i=0;i<l;i++) { dp[i][i]=0; } for(int i=0;i<l-1;i++) { if(str[i]==str[i+1]) dp[i][i+1]=0; else dp[i][i+1]=1; } for(int k=2;k<l;k++) { for(int i=0;i+k<l;i++) { int j=i+k; if(str[i]==str[j]) { dp[i][j]=dp[i+1][j-1]; } else { dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1); } } } // for(int i=0;i<l;i++) // { // for(int j=0;j<l;j++) // cout<<dp[i][j]<<' '; // cout<<endl; // } cout<<dp[0][l-1]<<endl; } }
迴文字串
時間限制:3000 ms | 記憶體限制:65535 KB 難度:4- 描述
- 所謂迴文字串,就是一個字串,從左到右讀和從右到左讀是完全一樣的,比如"aba"。當然,我們給你的問題不會再簡單到判斷一個字串是不是迴文字串。現在要求你,給你一個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為迴文字串。
- 輸入
- 第一行給出整數N(0<N<100)
接下來的N行,每行一個字串,每個字串長度不超過1000. - 輸出
- 每行輸出所需新增的最少字元數
- 樣例輸入
-
1 Ab3bd
- 樣例輸出
-
2
- 來源
- 上傳者