10739:String to Palindrome
問題文
http://uva.onlinejudge.org/external/107/10739.html
文字列が与えられる。ある1文字を追加、削除、置換することができる。
この3つの操作を繰り返すことで回文を作りたい。
操作を繰り返す回数の最小回数を求めよ。
l r l r 追加 e b c d a e b c d a e eを追加してl+1 l r l r 削除 a b c d a e a b c d a eを削除してr-1 l r l r 置換 a b c d e a b c d a eをaに置換してl+1, r-1
というのを再帰関数で書いて、メモ化した。
#include<iostream> #include<string> #include<algorithm> using namespace std; int memo[1001][1001]; string s; int rec(int l,int r){ if(l>=r)return 0; if(memo[l][r]>0)return memo[l][r]; int res=min(rec(l+1,r),rec(l,r-1))+1; res=min(res,rec(l+1,r-1)+(s[l]!=s[r])); return memo[l][r]=res; } int main(void){ int n; cin >> n; for(int i=1;i<=n;i++){ fill(memo[0],memo[1001],0); cin >> s; cout << "Case " << i << ": " << rec(0,s.size()-1) <<endl; } return 0; }