`

poj 1159

 
阅读更多

 

题目大意:给你一段字符串,让你求出在中间最少加入几个字符可以让他变成一段回文子串。

解题思路:假设S是一段字符串,S'是S的逆串,则只需求出S与S'的最长公共子序列即可的长度即可,最后用字符串的长度减去最长公共子序列的长度即是这道题目所求的加入的字母的长度。转化为LCS问题即可

 

注意:本题的内存开销非常大,由于题目中给出0<=N<=5000,

1. 静态数组 开销大小为5001*5001的int是铁定超的.据说用short int的话不会MLE,有兴趣的同学可以试试

2.动态数组 单纯的申请动态数组是不能解决这个问题的,动态数组只能增加空间利用率,但是本题最恶劣的数组大小还是5001*5001,动态数组是不能改变这个事实的

3. 滚动数组 这里重点讲一下滚动数组在这个题目中的应用.自己目前理解的应用滚动数组的目的就是减少空间开销.首先可以在纸上简单模拟一下DP的转移过程.确定好最少行数或者列数之后,重点就是在如何进行"滚动"以及如何用表达式控制这个滚动.

对于本题,我用的是行数以0--1--0—1的滚动方式滚动表达式为i%2和(i-1)%2 ,没错,就是强大的求余滚动O(∩_∩)O 

而且本题我为了稍微提高一点空间利用率,使用了 动态二维滚动数组,就是东邪(动态)西毒(滚动)的混合体O(∩_∩)O,这样做的目的,只是对测试数据库的数据抱有一点点希望:我相信它们不全都是5000的长度,所以我想能尽可能再节省一点列数….不过时间就惨不忍睹咯,1157ms….不过空间开销却由MLE跌落到谷底的280K\(^o^)/~

 

本题代码如下:

 

 

//Memory Time 
//280K  1157MS 

#include<iostream>
using namespace std;

int max(int a,int b)
{
	return a>b?a:b;
}

int main(int i,int j)
{
	int n;
	while(cin>>n)
	{
		/*Input*/
		
		char* s1=new char[n+1];
		char* s2=new char[n+1];   //s1的逆序列
		
		int **dp=new int*[n+1];   //定义二维动态滚动数组(本题以01行滚动)
		dp[0]=new int[n+1];
		dp[1]=new int[n+1];
		dp[0][0]=dp[1][0]=0; //动态数组初始化 行开头为全0
		
		for(i=1,j=n;i<=n;i++,j--)
		{
			dp[0][i]=dp[1][i]=0;  //动态数组初始化 列开头为全0
			
			char temp;
			cin>>temp;
			s1[i]=s2[j]=temp;
		}
		
		/*Dp-LCS*/
		
		int max_len=0;
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				if(s1[i]==s2[j])
					dp[i%2][j]=dp[(i-1)%2][j-1]+1;   //如果字符相等,则继承前一行前一列的dp值+1
				else
					dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]); //否则,取上方或左方的最大dp值
				
				if(max_len<dp[i%2][j])
					max_len=dp[i%2][j];
			}
			
			cout<<n-max_len<<endl;
			
			delete s1;
			delete s2;
			delete[] dp;
	}
	return 0;
}

 

 

附件图片中为一般的LCS算法,图片中的两个序列分别为x={2,5,7,9,3,1,2}与y={3,5,3,2,8}

 

这个解题报告很多是来自http://blog.csdn.net/lyy289065406/article/details/6648163

大家可以去围观下这位大神的解题报告。

 

 

 

 

 

 

 

  • 大小: 33.4 KB
分享到:
评论

相关推荐

    POJ1159-Palindrome

    【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...

    北大POJ1159-Palindrome

    北大POJ1159-Palindrome

    滚动数组应用:POJ 1159

    标题“滚动数组应用:POJ 1159”指的是一个关于编程竞赛问题的解决方案,该问题在POJ(Programming Online Judge)平台上被提出。滚动数组是一种优化动态规划算法的技术,通过巧妙地重用和更新已经计算过的状态,减少...

    acm训练计划(poj的题)

    - (poj3176, poj1080, poj1159):多维状态转移方程的应用。 ### 五、组合数学 1. **排列组合基础**: - 排列、组合的计算方法。 2. **多项式与快速幂**: - 多项式的运算规则以及快速幂算法。 3. **容斥原理*...

    acm新手刷题攻略之poj

    - 推荐题目:[poj3176](https://vjudge.net/problem/POJ-3176)、[poj1080](https://vjudge.net/problem/POJ-1080)、[poj1159](https://vjudge.net/problem/POJ-1159) - 组合计数问题需要熟练掌握排列组合的基本...

    ACM-POJ 算法训练指南

    2. **线段交**:计算线段是否相交及交点位置(poj3176, poj1080, poj1159)。 ### 七、概率统计 1. **概率计算**:计算随机事件的概率(POJ3252, poj1850, poj1019, poj1942)。 2. **期望值**:计算期望值问题...

    POJ 分类题目

    - poj1159 - **应用场景**:适用于路径规划、编辑距离计算等问题。 #### 六、数学 **1. 组合数学** - **定义**:研究离散对象的计数方法。 - **示例题目**: - poj1809 - poj3252 - poj1850 - poj1019 - poj...

    ACM常用算法及其相应的练习题.docx

    * 最长公共子序列:poj3176, poj1080, poj1159 * 最优二分检索树问题 六、数学 * 组合数学: + 加法原理和乘法原理 + 排列组合 + 递推关系 - poj3252, poj1850, poj1019, poj1942 * 数论: + 素数与整除问题...

    ACM算法总结大全——超有用!

    4. 最优二分检索树问题:如poj1159。 六、数学 1. 组合数学:加法原理、乘法原理、排列组合和递推关系,如poj3252、poj1850等。 2. 数论:素数、整除、进制位和同余模运算,如poj2635、poj3292等。 3. 计算方法:...

    北大acm试题

    poj1837和poj1276是背包问题的实例,而型如下表的简单DP问题,如poj3267、poj1836、poj1260和poj2533,以及最长公共子序列问题(如poj3176、poj1080和poj1159)都是动态规划的典型应用。 六、数学 数学在编程竞赛中...

    算法训练方案详解

    - **示例题目**: POJ 3267, POJ 1836, POJ 1260, POJ 2533, POJ 3176, POJ 1080, POJ 1159 - **注意事项**: 理解每种模型的状态定义和转移方程。 #### 六、数学 **1. 组合数学** - **定义**: 研究组合结构的...

    acm新手训练方案新手必备

    - POJ 1159: 编辑距离的复杂案例 #### 三、组合数学 组合数学主要涉及计数组合、排列组合等问题。 - **组合数**:掌握组合数的计算公式及其应用。 - **示例题目**: - POJ 3252: 组合数的应用 - POJ 1850: ...

    LeetCode判断字符串是否循环-Leetcode:刷!

    1159 POJ 2533 POJ 1836 Leetcode 70 Leetcode 309 搜索 DFS POJ 2488 POJ 3083 POJ 3009 POJ 1321 BFS POJ 3278 POJ 1426 POJ 3126 POJ 3414 POJ 2251 简单搜索技巧和剪枝 POJ 1010 :star: POJ 2362 POJ 1011(搜索...

    POJ 1125 1157 1159 1160 1163 1179

    标题 "POJ 1125 1157 1159 1160 1163 1179" 提供了一系列的编程题目编号,这些都是来自北京大学(Peking University)在线评测系统PKU Online Judge的挑战。这些题目主要针对ACM(国际大学生程序设计竞赛)参赛者,...

    北大POJ部分题目答案(一些基础题目)

    很多的POJ题目答案!1000~1008,1011~1014,1016,1017,1019,1028,1032,1045,1046,1047,1050,1061,1067,1068,1088,1102,1159,1163,1183,1207,1218,1226,1247,1256,1258,1298,1316,1323,...

    poj部分源码--Java

    poj平台有关数据结构题的Java源码 1159 1276 2406 2502 2509 2513 2533 2778 3176

    POJ 100题代码

    5. 题目1159《Permutation》:涉及到排列组合问题,需要生成所有可能的排列。可以采用回溯法或深度优先搜索(DFS)策略,结合递归实现全排列的生成。 6. 题目1040《Tic Tac Toe》:此题是关于井字游戏的判断,考察...

    POJ各题算法分类和题目推荐 ACM必看

    * 1159 Palindrome:本题目使用动态规划来计算回文串的最长长度。 * 1160 Post Office:本题目使用动态规划来计算邮局的最短距离。 * 1458 Common Subsequence:本题目使用动态规划来计算两个序列的最长公共子序列。...

    poj上算法题目分类

    - 1037, 1050, 1088, 1125, 1141, 1159, 1160, 1163, 1458, 1579, 1887, 1953, 2386 **关键知识点:** - **贪心算法**:在每一步都选择局部最优解。 - **回溯算法**:采用试探性的策略来搜索所有可能的解决方案。 -...

    poj经典动态规划题目解题报告

    poj经典动态规划题目解题报告,包括经典的动态规划题目20多道,可以作为学习动态规划系统的资料,包括题目: Pku acm 1179 Polygon Pku acm 1125 Stockbroker Grapevine Pku acm 1160 post office Pku ...

Global site tag (gtag.js) - Google Analytics