【发布时间】:2016-04-10 07:24:13
【问题描述】:
问题陈述:
回文是一个对称的字符串,即从左到右以及从右到左读取相同的字符串。你要编写一个程序,给定一个字符串,确定要插入字符串中的最少字符数,以获得回文。例如,通过插入 2 个字符,字符串“Ab3bd”可以转换为回文(“dAb3bAd”或“Adb3bdA”)。但是,插入少于 2 个字符不会产生回文。
输入
第一行包含一个整数:输入字符串的长度N,3≤N≤5000。第二行包含一个长度为 N 的字符串。该字符串由从“A”到“Z”的大写字母、从“a”到“z”的小写字母和从“0”到“9”的数字组成。大写和小写字母被认为是不同的。
输出
第一行包含一个整数,这是所需的最小数字。
问题链接 => http://www.spoj.com/problems/IOIPALIN/
我的解决方案:
#include <iostream>
#include <memory.h>
#include <cstdio>
using namespace std;
long memo[5010][5010];
string s;
long int n;
long solve(long i,long j){
if(memo[i][j]!=-1){
return memo[i][j];
}
if(i>=j)
return 0;
if(s[i]==s[j])
return solve(i+1,j-1);
return memo[i][j]= min(solve(i,j-1)+1,solve(i+1,j)+1);
}
int main()
{
ios_base::sync_with_stdio(false);
long int n ;
cin>>n;
cin>>s;
memset(memo,-1,sizeof(memo));
long int a = solve(0,n-1);
cout << a << endl;
return 0;
}
我收到此代码的“超出时间限制”。我怎样才能解决这个问题 ?
【问题讨论】:
-
请注意,“DP程序”是多余的。
标签: c++ dynamic-programming memoization