Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- string s;
- int dp[20][20], ans[20][20];
- int call(int i, int j)
- {
- if(i >= j) return 0;
- if(dp[i][j] != -1) return dp[i][j];
- if(s[i] == s[j])
- {
- ans[i][j] = 0; // 0 means no insert
- return dp[i][j] = call(i+1, j-1);
- }
- int res1 = 1+call(i+1, j);
- int res2 = 1+call(i, j-1);
- if(res1 < res2)
- {
- ans[i][j] = 1; // 1 means insert last
- return dp[i][j] = res1;
- }
- else
- {
- ans[i][j] = 2; // 2 means insert first
- return dp[i][j] = res2;
- }
- // return dp[i][j] = min(1+call(i+1, j), 1+call(i, j-1));
- }
- string print(int i, int j, string k, int l, int r)
- {
- if(ans[i][j] == -1) return k;
- if(ans[i][j] == 0) return print(i+1, j-1, k, l, r);
- if(ans[i][j] == 1)
- {
- string res = "";
- for(int p = 0; p<=j+l; p++) res += k[p];
- res += s[i];
- for(int p=j+l; p<k.size()-r; p++) res += k[p];
- k = res;
- cout << k << endl;
- return print(i+1, j, k, l, r+1);
- }
- else
- {
- string res = "";
- for(int p = 0; p<i+l; p++) res += k[p];
- res += s[j];
- for(int p=i+l; p<k.size()-r; p++) res += k[p];
- k = res;
- cout << k << endl;
- return print(i, j-1, k, l+1, r);
- }
- }
- int main() {
- cin >> s;
- memset(dp, -1, sizeof(dp));
- memset(ans, -1, sizeof(ans));
- cout << call(0, s.size()-1) << endl;
- for(int i = 0; i<s.size(); i++)
- {
- for(int j = 0; j<s.size(); j++)
- {
- printf("%4d", ans[i][j]);
- }
- cout << endl;
- }
- cout << print(0, s.size()-1, s, 0, 0) << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement