poj 1836

来源:互联网 发布:曾经的网络流行语 编辑:程序博客网 时间:2024/05/17 03:09

传送门http://poj.org/problem?id=1836


LIS的变形

两次LIS再相加取最大

//题目大意是给出一队士兵,要从中选一些人出来,使剩下的队列满足//a1 < a2 < a3 ... < a(i ) <=> a(i+1) > a(i+2) > .. a(n-1) > a(n)#include<iostream>#include<cstdio>#define maxn 1005using namespace std;double a[maxn];int l[maxn]={0},r[maxn]={0};int main(){    int n;    cin>>n;    for(int i=1;i<=n;i++)    scanf("%lf",&a[i]);    l[1]=1;    for(int i=2;i<=n;i++)    {        l[i]=1;        for(int j=1;j<i;j++)            if(a[j]<a[i]&&l[j]>=l[i])                l[i]=l[j]+1;    }    r[n]=1;    for(int i=n-1;i>=1;i--)    {        r[i]=1;        for(int j=n;j>i;j--)        {            if(a[j]<a[i]&&r[j]>=r[i])            r[i]=r[j]+1;        }    }    int max=0;    for(int i=1;i<=n-1;i++)//不用到n 因为r[n]=1 用max=r[n]+l[n-1]相加代替了        for(int j=i+1;j<=n;j++)//中间的人可以抽走 不必连着        {            if(l[i]+r[j]>max)            max=l[i]+r[j];        }    cout<<n-max<<endl;}



原创粉丝点击