您的位置:首页 > 其它

poj 1836 Alignment(双向LIS)

2018-03-28 16:48 477 查看
题目:点击打开链接
题意:
和vijos合唱队形一样,还是两遍矮,中间高,不一样的是时限要求。
思路:
还是正反两个LIS,但要换种写法,没必要外面套一层循环。
注意j==i时减一。#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1010;

int l[maxn],r[maxn];
double h[maxn];

int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>h[i];
fill(l,l+n,1); fill(r,r+n,1);
for(int i=1;i<n;i++){
for(int j=0;j<i;j++)
if(h[j]<h[i])
l[i]=max(l[j]+1,l[i]);
}
for(int i=n-2;i>=0;i--){
for(int j=n-1;j>=i;j--)
if(h[j]<h[i])
r[i]=max(r[j]+1,r[i]);
}
int ans=0;
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
if(j==i) ans=max(ans,l[i]+r[j]-1);
else ans=max(ans,l[i]+r[j]);
cout<<n-ans<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: