博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)
阅读量:6902 次
发布时间:2019-06-27

本文共 2644 字,大约阅读时间需要 8 分钟。

Palindrome
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 53414   Accepted: 18449

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

5Ab3bd

Sample Output

2

Source

IOI 2000
题目大意:加入最少的字符。使得字符串变为回文串
假设一个字符串是回文串。那么它与它的逆序数组的最长公共子序列为自身的长度,所以求出最长公共子序列的长度后,用总的长度减去它。得到的就是要改动的长度。

使用short的5000*5000的数组

#include 
#include
#include
using namespace std;short dp[5100][5100] ;char str1[5100] , str2[5100] ;int main(){ int i , j , n ; while(scanf("%d", &n) !=EOF) { scanf("%s", str1); for(i = 0 ; i < n ; i++) str2[n-1-i] = str1[i] ; str2[i] = '\0' ; for(i = 1 ; i <= n ; i++) for(j = 1 ; j <= n ; j++) { if( str1[i-1] == str2[j-1] ) dp[i][j] = dp[i-1][j-1]+1 ; else dp[i][j] = max( dp[i-1][j],dp[i][j-1] ); } printf("%d\n", n-dp[n][n]); } return 0;}

使用滚动数组

滚动数组:使用两行数组,模拟大的二维数组

#include 
#include
#include
using namespace std;int dp[2][5100] ;char str1[5100] , str2[5100] ;int main(){ int i , j , n , k ; while(scanf("%d", &n) !=EOF) { scanf("%s", str1); for(i = 0 ; i < n ; i++) str2[n-1-i] = str1[i] ; str2[i] = '\0' ; k = 0 ; for(i = 1 ; i <= n ; i++) { k = 1 - k ; for(j = 1 ; j <= n ; j++) { if( str1[i-1] == str2[j-1] ) dp[k][j] = dp[1-k][j-1]+1 ; else dp[k][j] = max( dp[1-k][j],dp[k][j-1] ); } } printf("%d\n", n-dp[k][n]); } return 0;}

 

转载地址:http://koldl.baihongyu.com/

你可能感兴趣的文章
让Asp.Net WebAPI支持OData查询,排序,过滤。(转)
查看>>
在centos中安装mangodb
查看>>
Windows Dos命令下查看端口号,杀死端口
查看>>
VS------csc.exe已停止工作解决方法
查看>>
PHP mysql_fetch_array与mysql_fetch_row的区别
查看>>
Python ORM框架之 Peewee入门
查看>>
Windows版Mycat结合mysql安装配置+水平切分(转载)
查看>>
CSS3 Flex布局整理(二)-容器属性
查看>>
第11章:sed进阶操作
查看>>
js获取单独一个checkbox是否被选中
查看>>
【工具】Sublime + MarkdownEditing + OmniMarkupPreviewer使用起来
查看>>
django Multi-table inheritance ---- 用于实现基表-子表
查看>>
关于Mac终端故障一直出现 [进程已完毕]
查看>>
带着问题学习分布式系统之数据分片
查看>>
Maven实现Web应用集成測试自己主动化 -- 測试自己主动化(WebTest Maven Plugin)
查看>>
jvm虚拟机原理1
查看>>
51 Nod 1029 大数除法【Java大数乱搞】
查看>>
1941套站点模版,终生收藏,个个精品
查看>>
使用Reveal来查看别人的APP界面+白苹果不刷机解决方式
查看>>
MongoDB(六)-- 集群搭建
查看>>