P1435 [IOI2000] 迴文字串 / [藍橋杯 2016 省] 密碼脫落
阿新 • • 發佈:2022-03-29
很簡單的一道dp
dp[i,j]表示區間[i,j]最少次數變為迴文串
初始狀態dp[i,i]=0單個字元就是迴文串
轉移 區間從小到大進行轉移
如果s[i]==s[j] 那dp[i,j]=dp[i-1,j-1]
如果s[i]!=s[j] 那dp[i,j]=max(dp[i-1,j],dp[i,j-1])+1
點選檢視程式碼
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 1007; int f[maxn][maxn]; char s[maxn]; int len; // 字串長度 void dp() { for(int k = 1; k < len; k++) // 列舉頭尾間距 for(int i = 1; i <= len - k; i++) { // 列舉起點 int j = i + k; // 算出終點 if(s[i] == s[j]) { f[i][j] = f[i + 1][j - 1]; } else { f[i][j] = min(f[i + 1][j], f[i][j - 1]) + 1; } } } int main() { //freopen(".in", "r", stdin); //freopen(".out", "w", stdout); scanf("%s", s + 1); // 輸入字串,第一個字母在s[1] len = strlen(s + 1); // 從s[1]開始算字串的長度 //對於每一個只有一個字元的字串來說,它必是迴文 for(int i = 1; i <= len; i++) f[i][i] = 0; dp(); cout << f[1][len]; return 0; }