C - Palindrome——区间DP,巧妙的利用滚动数组
来源:互联网 发布:如何导出淘宝数据包 编辑:程序博客网 时间:2024/05/23 20:52
C - Palindrome
Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64uDescription
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.
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
巧妙利用取余实现滚动数组,此处要利用到两个数组,所以对二取余
/*************************************************************************> File Name: 1.cpp> Author:chudongfang > Mail:1149669942@qq.com > Created Time: 2016年05月23日 星期一 16时26分12秒 ************************************************************************/#include<stdio.h>#include<string.h>#include<math.h>int inf=9999999;int my_max(int x,int y) { return x>y?x:y; }int my_min(int x,int y) { return x>y?y:x; }using namespace std;int dp[2][5005];char a[5005];int n;int main(int argc,char *argv[]){ int i,j; while(scanf("%d",&n)!=EOF) { memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); scanf("%s",a); for(i=n-2;i>=0;i--) { for(j=i+1;j<n;j++) { if(a[i]==a[j]) dp[i%2][j]=dp[(i+1)%2][j-1];//此处利用了滚动数组 else dp[i%2][j]=my_min(dp[(i+1)%2][j],dp[i%2][j-1])+1; } } printf("%d\n",dp[0][n-1]); } return 0;}
0 0
- C - Palindrome——区间DP,巧妙的利用滚动数组
- 区间dp+ 滚动数组uva1632
- POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)
- POJ1159——Palindrome——DP+滚动数组(节省空间)
- POJ 1159 Palindrome DP 滚动数组
- poj 1159 Palindrome ( dp 滚动数组 )
- Poj 1159-Palindrome DP (滚动数组优化)
- poj - 1159 - Palindrome(滚动数组dp)
- POJ 1159 Palindrome(DP + 滚动数组)
- POJ 1159 Palindrome(DP LCS&滚动数组)
- poj 1159 Palindrome(dp+滚动数组)
- POJ1159 Palindrome(滚动数组DP)
- cf558B查找最短的最大区间段,利用二维数组巧妙简化运算
- poj 1141(区间dp 滚动数组)
- POJ 1159 Palindrome(区间动归 滚动数组)
- 区间DP基础篇之 POJ1159——Palindrome
- hdu 3392 利用滚动数组优化的dp
- POJ3280Cheapest Palindrome(区间dp)
- Leakcanary部分泄露警报无需修复
- Fragment监听返回键
- Eclipse项目转AndroidStudio遇到问题记录
- 计算机图形学(二)输出图元_14_OpenGL像素阵列函数_1_位图函数
- 获取时间程序(客户端和服务器)
- C - Palindrome——区间DP,巧妙的利用滚动数组
- sdut 2617 矩阵(sdut第五届校赛)
- Android中ListView分页加载数据
- 构造器和this()
- static的作用
- 日志管理
- 数组简介
- 160个CrackMe 002 Afkayas.1
- NOIp2012 借教室