HDU ACM 4512 吉哥系列故事——完美队形I ->LCIS最长公共递增子序列

分析:最长公共递增子序列,把数据反向存储一遍,求正反两组数据的LCIS。另外注意边界的条件判断。还有如果取出的新队列有奇数个人或偶数个人要单独判断。

#include<iostream>
using namespace std;

#define max(a,b) ((a)>(b)?(a):(b))
int dp[202];
int a[202];
int b[202];

int LCIS(int n)
{
	int i,j,maxlen,ans;

	memset(dp,0,sizeof(dp));
	ans=0;
	for(i=1;i<=n;i++)
	{
		maxlen=0;
		for(j=1;j<=n-i+1;j++)    //j<=n-i+1保证中间最多重复一人
		{
			if(a[i]>b[j])
				maxlen=max(maxlen,dp[j]);
			else if(a[i]==b[j])
				dp[j]=maxlen+1;
			if(i<n-j+1)                 //是否重叠
				ans=max(ans,dp[j]*2);
			else
				ans=max(ans,dp[j]*2-1);
		}
	}
	return ans;
}

int main()
{
	int T,n,i;

	cin>>T;
	while(T--)
	{
		cin>>n;
		for(i=1;i<=n;i++)
		{
			cin>>a[i];
			b[n-i+1]=a[i];      //逆序存储
		}
		cout<<LCIS(n)<<endl;
	}
	return 0;
}
时间: 2024-10-26 11:08:04

HDU ACM 4512 吉哥系列故事——完美队形I ->LCIS最长公共递增子序列的相关文章

HDU 4512 吉哥系列故事——完美队形I(LCIS最长公共上升子序列)

http://acm.hdu.edu.cn/showproblem.php?pid=4512 题意: 吉哥这几天对队形比较感兴趣. 有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则称之为完美队形: 1.挑出的人保持他们在原队形的相对顺序不变: 2.左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然,如果m是奇数,

hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)

首先要去学习最长公共上升子序列LCIS,然后是对n*n效率的算法进行优化,这里要注意的是可以求出来的序列中间可以有一个最高的.刚开始将输入的数组进行逆置,写下来发现这可能存在问题.不过具体是什么也没有仔细想明白. #include<bits/stdc++.h> using namespace std; int dp[300][300],a[300]; int main() { int n,_,i,j,k,ans,mx,t; scanf("%d",&_); while

HDU 4512 吉哥系列故事——完美队形(LCIS)

Problem Description 吉哥这几天对队形比较感兴趣. 有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则称之为完美队形: 1.挑出的人保持他们在原队形的相对顺序不变: 2.左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然,如果m是奇数,中间那个人可以任意: 3.从左到中间那个人,身高需保证递增,如

hdu 4512 吉哥系列故事——完美队形I LCIS

题目链接 给一个数列, 在里面选出一些数组成一个对称的数列, 数的顺序不能打乱. 使得左半边是一个严格递增的数列, 右边递减, 并且a[i] = a[n-i+1]. 就是一个对称的LCIS.. #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include

HDU ACM 4513 吉哥系列故事——完美队形II-&gt;求最长回文串(manacher算法)

分析:该題可以通过求最长回文串的方法来解决:求最长回文串使用manacher算法,O(n)时间复杂度. 注意:while(a[i-len[i]]==a[i+len[i]] && a[i-len[i]]<=a[i-len[i]+2])这里多出的判断a[i-len[i]]<=a[i-len[i]+2]即为该題的限制从左到中保证身高不降,因在回文串的计算过程中添加了额外的字符,所以这里是i-len[i]+2而不是i-len[i]+1,以避开添加的字符. #include<ios

吉哥系列故事——完美队形I(最长严格递增回文串 +hdu 4512)

吉哥系列故事--完美队形I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2652    Accepted Submission(s): 862 Problem Description 吉哥这几天对队形比较感兴趣. 有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这

HDU 4512——吉哥系列故事——完美队形I——————【LCIS应用】

吉哥系列故事——完美队形I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 2707    Accepted Submission(s): 886 Problem Description 吉哥这几天对队形比较感兴趣. 有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些

HDU 4512 吉哥系列故事——完美队形I

吉哥系列故事——完美队形I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 2186    Accepted Submission(s): 696 Problem Description 吉哥这几天对队形比较感兴趣. 有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些

hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))

吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1012    Accepted Submission(s): 358 Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让