poj1159-Palindrome(最长公共子序列)

来源:互联网 发布:7u分享网络官网跑路 编辑:程序博客网 时间:2024/06/05 17:45
#include <iostream>#include <cstring>#include <algorithm>using namespace std;struct poj1159 {/*[问题描述]:已知一个序列,求至少添加多少个元素使得该序列成为一个回文序列*//*[解题思路]:需要添加的元素数=原序列长度-原序列与逆序列的最长公共子序列长度,*从而将问题转换为最长公共子序列问题.*由于每次f[i][j]的决策只需要考虑f[i-1][j-1],f[i-1][j],f[i][j-1],*可以采用滚动数组对空间进行优化*/int n;char str[5005];int f[2][5005];void work() {while (cin >> n) {cin >> str + 1;for (int i = 0; i <= n; i++) {for (int j = n + 1; j >= 1; j--) {if (i != 0 && j != n + 1) {if (str[i] == str[j])f[i % 2][j] = f[(i - 1) % 2][j + 1] + 1;elsef[i % 2][j] = max(f[(i - 1) % 2][j], f[i % 2][j + 1]);}elsef[i % 2][j] = 0;}}cout << n - f[n % 2][1] << endl;}}};int main(){poj1159 solution;solution.work();return 0;}

0 0
原创粉丝点击