POJ1836

题目大意

一队士兵排成一条直线,问最少出队几个士兵,使得队里的每个士兵都可以看到又端点或者左端点

题解

从左往右搞一遍LIS,然后从右往左搞一遍LIS,然后枚举即可。。。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 1005
double a[MAXN];
int d[MAXN],c[MAXN];
int main()
{
    int n;
    while(cin>>n)
    {
        memset(d,0,sizeof(d));
        memset(c,0,sizeof(c));
        for(int i=1; i<=n; i++)
        {
            cin>>a[i],d[i]=1,c[i]=1;
        }
        for(int i=2; i<=n; i++)
            for(int j=1; j<i; j++)
                if(a[j]<a[i]&&d[j]+1>d[i])
                    d[i]=d[j]+1;
        for(int i=n-1; i>=1; i--)
            for(int j=i+1; j<=n; j++)
                if(a[j]<a[i]&&c[j]+1>c[i])
                    c[i]=c[j]+1;
        int ans=max(d[n],c[1]);
        for(int i=1; i<n; i++)
            for(int j=i+1; j<=n; j++)
                ans=max(ans,d[i]+c[j]);
        cout<<n-ans<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/zjbztianya/p/3255968.html