1. 程式人生 > >hihocoder 1323 回文字符串(字符串+dp)

hihocoder 1323 回文字符串(字符串+dp)

blog space style 題目 比較 return har () 題解

題解:

比較水的題目

dp[i][j]表示[i...j]最少改變幾次變成回文字符串

那麽有三種轉移

dp[i][j] = dp[i+1][j-1] + s[i] != s[j]

dp[i][j] = dp[i+1][j] + 1(刪除左邊的字符,或者在右邊添加一個字符與左邊匹配)

dp[i][j] = dp[i][j-1] + 1(刪除右邊的字符,或者在左邊添加一個字符與右邊匹配)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char S[110
]; int dp[110][110]; int dfs(int i, int j){ if(i >= j) return 0; if(dp[i][j] < 100) return dp[i][j]; dp[i][j] = min(dp[i][j], dfs(i+1, j) + 1); dp[i][j] = min(dp[i][j], dfs(i, j-1) + 1); dp[i][j] = min(dp[i][j], dfs(i+1, j-1) + (S[i] != S[j])); return dp[i][j]; } int main() {
while(cin>>S){ int n = strlen(S); memset(dp, 1, sizeof(dp)); cout<<dfs(0, n-1)<<endl; } return 0; }

hihocoder 1323 回文字符串(字符串+dp)