Palindrome 动态规划算法 +空间优化
来源:互联网 发布:西瓜趣味编程营 编辑:程序博客网 时间:2024/06/03 22:43
Palindrome
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 15 Accepted Submission(s) : 6
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.
Input
Output
Sample Input
5Ab3bd
Sample Output
2
Source
/*
dp[i][j]=max(dp[i+1][j-1]+same(i,j),dp[i+1][j],dp[i][j-1])
same(i,j):若str[i]==str[j],则返回1,否则返回0
空间复杂度:O(N^2);
优化:
用数组A[]记录dp[i+1][j-1]、dp[i+1][j];
用数组dp[]记录dp[j]、dp[j-1];
空间复杂度:O(N);
*/
#include<iostream>
#include<malloc.h>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 5001;
char str[MAXN];
int dp[MAXN],A[MAXN];
int N;
int maxx(int a, int b){
if (a<b)
return b;
return a;
}
void ss(){
int i, j;
memset(dp, 0, sizeof(dp));
memset(A,0,sizeof(A));
for (i = N; i > 0; i--){ //注意这里顺序要逆序,否则wa
for (j = 1; j <= N; j++){
if (str[i] == str[j]){
dp[j] = A[j - 1] + 1;
}
else{
dp[j] = maxx(A[j], dp[j - 1]);
}
}
for (j = 1; j <= N; j++){
A[j] = dp[j];
}
}
cout << N - dp[N] << endl;
}
int main(){
int i;
freopen("in.txt", "r", stdin);
while(~scanf("%d", &N)){
for (i = 1; i <= N; i++){
cin >> str[i];
}
ss();
}
return 0;
}
- Palindrome 动态规划算法 +空间优化
- POJ1141 动态规划,空间优化
- 01背包问题的动态规划算法、蛮力法和空间优化算法
- 动态规划算法之资源分配问题及其空间优化方案
- [动态规划]Pku1159--Palindrome
- POJ1159 Palindrome 【动态规划】
- hdu1513 Palindrome 动态规划
- 动态规划之Palindrome
- 动态规划_动态规划算法的优化技巧
- 动态规划算法的优化技巧
- 动态规划算法的优化技巧
- 动态规划算法的优化技巧
- 动态规划算法的优化技巧
- 动态规划算法的优化技巧
- [算法]动态规划 多重背包 二进制优化
- 动态规划算法的优化技巧
- Palindrome POJ 1159 动态规划
- poj 1159 Palindrome 动态规划
- 个人项目-网络电话呼叫客户端 (一)
- Shell 职责
- VMware vSphere - 存储性能监控与分析之vscsiStats工具介绍
- hdu 1249 三角形
- ubuntu设置默认启动方式——命令行
- Palindrome 动态规划算法 +空间优化
- 排序方法
- jihigh自己总结
- 在android系统启动时获取通知
- 【RT-Thread中期检查】RT-Thread 加入IPV6支持
- poj2503(简单hash)
- ubuntu设置代理
- C和C++的区别
- Java静态引入