poj1159-Palindrome(最长公共子序列)
2017-04-11 19:19
253 查看
#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; else f[i % 2][j] = max(f[(i - 1) % 2][j], f[i % 2][j + 1]); } else f[i % 2][j] = 0; } } cout << n - f[n % 2][1] << endl; } } }; int main() { poj1159 solution; solution.work(); return 0; }
相关文章推荐
- POJ - 1159 Palindrome 最长公共子序列
- poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)
- 动态规划经典 最长公共子序列 poj1159
- POJ1159--Palindrome
- poj1159 Palindrome 区间DP
- poj 1159 Palindrome(最长公共子序列 + 滚动数组)
- Palindrome(poj1159)(动态规划)
- POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)
- poj1159 Palindrome
- HDU:1513 Palindrome(回文字符串+最长公共子序列+滚动数组)
- Palindrome 简单(dp)poj1159
- POJ 1159 Palindrome(最长公共子序列)
- PKU-1159 Palindrome (最长公共子序列LCS)
- Palindrome(最长公共子序列)
- POJ1159,Palindrome
- poj1159 Palindrome (dp)
- Poj1159 Palindrome 【简单DP】(LCS)
- POJ 1159 Palindrome(回文串,最长公共子序列)
- HDU 1513 Palindrome(最长公共子序列)
- poj1159 Palindrome(最长公共子序列)