您的位置:首页 > 其它

poj 1836

2016-05-14 20:36 399 查看
LIS家族举家出动

给出n个士兵的身高,要求留下一些士兵,使得每个士兵向左向右看都可以看到无穷远(要求太高啦(ˉ▽ ̄~) )

怎么办呢?

感觉告诉我们一定是找最长上升子序列

(^o^)/YES!

于是我们就正着找一遍再倒着找一遍,然后枚举寻找最长的类似三角形的序列即可

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1000+10;
int n;
double integer[maxn];
int f[maxn],ref[maxn];
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>integer[i];
for(int i=1;i<=n;i++){
f[i]=1;
for(int j=1;j<i;j++)
if(integer[i]>integer[j])
f[i]=max(f[i],f[j]+1);
}
for(int i=n;i>=1;i--){
ref[i]=1;
for(int j=n;j>i;j--)
if(integer[i]>integer[j])
ref[i]=max(ref[i],ref[j]+1);
}
int ans=1;
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
ans=max(ans,f[i]+ref[j]);
cout<<n-ans<<endl;
return 0;
}


by >o< neighthorn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: