| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
一个水题也Wa 了很久。。说一下我的问题。。1、两遍lcs
2、枚举顶点
注意:
1、是可以看到无穷远处,就是对于新的数列b: b1<b2<b3....<bi bi+1>bi+2.... 两头必须也强小于
2、中间可能有一个或者两个顶点,两个顶点的情况有可能顶点在a数组里面不挨着。
给出代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int NN=2000;
double a[NN];
int lcsl[NN],lcsr[NN],ans,n;
int main()
{
int tmp;
scanf("%d",&n);
memset(a,0,sizeof(a));
memset(lcsl,-1,sizeof(lcsl));
memset(lcsr,-1,sizeof(lcsr));
for (int i=0;i<n;++i) scanf("%lf",&a[i]);
lcsl[0]=1;
for (int i=1;i<n;++i)
{
for (int j=0;j<i;++j)
if (lcsl[j]+1>lcsl[i] && a[j]<a[i])
lcsl[i]=lcsl[j]+1;
if (lcsl[i]==-1) lcsl[i]=1;
}
lcsr[n-1]=1;
for (int i=n-2;i>=0;--i)
{
for (int j=n-1;j>i;--j)
if (lcsr[j]+1>lcsr[i] && a[i]>a[j])
lcsr[i]=lcsr[j]+1;
if (lcsr[i]==-1) lcsr[i]=1;
}
ans=-1;
for (int i=0;i<n-1;++i)
for (int j=i+1;j<n;++j)
if (lcsl[i]+lcsr[j]>ans)
ans=lcsl[i]+lcsr[j];
for (int i=0;i<n;++i)
if (lcsl[i]+lcsr[i]-1>ans)
ans=lcsl[i]+lcsr[i]-1;
printf("%d\n",n-ans);
//system("pause");
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator