打了几个小时打出来的合唱队形,用常规解法,但是有地方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;
}