POJ 1159 Palindrome DP 滚动数组

Palindrome
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 49618 Accepted: 17063

Description

A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inserted into the string in order to obtain a palindrome. 

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

Your program is to read from standard input. The first line contains one integer: the length of the input string N, 3 <= N <= 5000. The second line contains one string with length N. The string is formed from uppercase letters from 'A' to 'Z', lowercase letters from 'a' to 'z' and digits from '0' to '9'. Uppercase and lowercase letters are to be considered distinct.

Output

Your program is to write to standard output. The first line contains one integer, which is the desired minimal number.

Sample Input

5
Ab3bd

Sample Output

2

Source


中文题目名是回文词、、、老题了。网上找了中文的题目

描述 Description  
    回文词是一种对称的字符串——也就是说,一个回文词,从左到右读和从右到左读得到的结果是一样的。任意给定一个字符串,通过插入若干字符,都可以变成一个回文词。你的任务是写一个程序,求出将给定字符串变成回文词所需插入的最少字符数。
  比如字符串“Ab3bd”,在插入两个字符后可以变成一个回文词(“dAb3bAd”或“Adb3bdA”)。
输入格式 Input Format 
    第一行包含一个整数N,表示给定字符串的长度,3<=N<=5000。

    第二行是一个长度为N的字符串,字符串由大小写字母和数字构成。
输出格式 Output Format 
    一个整数,表示需要插入的最少字符数。

求出字符串正序和反序的最长公共子序列,然后长度减去最长公共子序列就是要插入的个数。

因为空间要求高,5000*5000的int数组会超时。所以需要滚动数组优化。

话说,高中学这个的时候完全没看懂的说。不过现在弄明白了。%2非常巧妙,避免了复制数组

看到别人在题解上炫耀时间空间神马的。像我这样图省事用cin和string类。时间空间消耗都很大。

#include <iostream>
using namespace std;
int a[2][5001]={0},n,i,j;
string s;
int main()
{
	cin>>n>>s;
	for (i=1;i<=n;++i)
		for (j=1;j<=n;++j)
			if (s[i-1]==s[n-j])
				a[i%2][j]=a[(i-1)%2][j-1]+1;
			else a[i%2][j]=a[(i-1)%2][j]>a[i%2][j-1]?a[(i-1)%2][j]:a[i%2][j-1];
	cout<<n-a[n%2][n]<<endl;
	return 0;
} 

kdwycz的网站:  http://kdwycz.com/

kdwyz的刷题空间:http://blog.csdn.net/kdwycz



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值