您的位置:首页 > 其它

Vijos P1098 合唱队形题解

2014-09-28 22:29 344 查看
程序思路就是  求一遍最长上升子序列长度和最长下降子序列长度。

#include <iostream>

using namespace std;

int a[1001],f[1001],g[1001];

int MaxLenA,MaxLenB,n,Maxans;

int main()

{

    int n;

    cin>>n;

    for (int i=1;i<=n;i++) cin>>a[i];

    // 分别求解以middle为中间点(1<=middle<=N)时 

    // 1~middle最长上升序列和middle~N最长下降序列的长度和 

    // 并保存最小值.

    

    int i,j,middle,ans;

    for (middle=1;middle<=n;middle++)

    {

        f[1]=1;

        for (i=2;i<=middle;i++)

        {

            f[i]=1;

            for (j=i-1;j>=1;j--)

            {

                if (f[j]+1>f[i] && a[i]>a[j]) f[i]=f[j]+1;

            }

        }

        // 1~middle最长上升序列 

        

        g[middle]=1;

        for (i=middle+1;i<=n;i++)

        {

            g[i]=1;

            for (j=i-1;j>=middle;j--)

            {

                if (g[j]+1>g[i] && a[i]<a[j]) g[i]=g[j]+1;

            }

        }

        // middle~N最长下降序列 

        MaxLenA=MaxLenB=0;

        for (i=1;i<=middle;i++)

            if (f[i]>MaxLenA) MaxLenA=f[i];

        for (i=middle;i<=n;i++)

            if (g[i]>MaxLenB) MaxLenB=g[i];

        ans=MaxLenA+MaxLenB-1;

        if (ans>Maxans) Maxans=ans;

    }    

    cout<<(n-Maxans)<<endl;

    system("pause");

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vijos 最长子序列