P1091
查看原帖
P1091
411963
uFTvL9楼主2021/7/6 18:00

打了几个小时打出来的合唱队形,用常规解法,但是有地方re,还有的wa。 有没有哪位好先生帮帮忙呢? 代码过于复杂了,本人也难以辨认,但是LIS和LCS有包装成函数。

#include<bits/stdc++.h>
using namespace std;
int LIS(register int a[],register int l)
{
	register int dp[l];
	for(register int i=0;i<l;i++)
		dp[i]=1;
	for(register int i=1;i<l;i++)
		for(register int j=0;j<i;j++)
		{
			if(a[j]<=a[i]&&dp[j]+1>=dp[i])
				dp[i]=dp[j]+1;
		}
	register int max_=-1;
	for(register int i=0;i<l;i++)
	{
		if(dp[i]>max_)
			max_=dp[i];
	}
	return max_;
}
int LCS(register int a[],register int l)
{
	register int dp[l];
	for(register int i=0;i<l;i++)
		dp[i]=1;
	for(register int i=1;i<l;i++)
		for(register int j=0;j<i;j++)
		{
			if(a[j]<=a[i]&&dp[j]+1>=dp[i])
				dp[i]=dp[j]+1;
		}
	register int max_=-1;
	for(register int i=0;i<l;i++)
	{
		if(dp[i]>max_)
			max_=dp[i];
	}
	return max_;
}
int main()
{
	register int N;
	scanf("%d",&N);
	register int T[N];
	register int ans[N];
	for(register int i=0;i<N;i++)
		scanf("%d",&T[i]);
	for(register int i=0;i<N;i++)
	{
		register int low[N];
		register int up[N];
		register int j;
		for(j=0;j<i;j++)
			up[j]=T[j];
		ans[i]+=LIS(up,j+1);
		for(j=i;i<N;j++)
			low[j]=T[j];
		ans[i]+=LCS(low,j-i);
	}
	register int min_=-1;
	for(register int i=0;i<N;i++)
		min_=min(min_,ans[i]);
	printf("%d",N-min_);
	return 0;
}

2021/7/6 18:00
加载中...