当前位置:编程学习 > C/C++ >>

rnqoj-28-合唱队形-最长上升子序列

想当年大一的时候,一个最长上升子序列的问题使得我的罚时上升了不少。。。。当年还是图样啊
这道题目本质就是求最长上升子序列
 
#include<stdio.h>  
#include<string.h>  
#include<iostream>  
#include<algorithm>  
using namespace std;  
int main()  
{  
    int i,n,j,a[201];  
    cin>>n;  
    for(i=1;i<=n;i++)  
    {  
        scanf("%d",&a[i]);  
    }  
    int dp1[201];  
    int dp2[201];  
    memset(dp1,0,sizeof(dp1));  
    memset(dp2,0,sizeof(dp2));  
    for(i=1;i<=n;i++)  
    {  
        int ma=1;  
        for(j=1;j<i;j++)  
        {  
            if(a[j]<a[i])ma=max(ma,dp1[j]+1);  
        }  
        dp1[i]=ma;  
    }  
    for(i=n;i>=1;i--)  
    {  
        int mb=1;  
        for(j=n;j>i;j--)  
        {  
            if(a[j]<a[i])mb=max(mb,dp2[j]+1);  
        }  
        dp2[j]=mb;  
    }  
    int ans=0;  
    for(i=1;i<=n;i++)  
    {  
        ans=max(dp2[i]+dp1[i]-1,ans);  
    }  
    cout<<n-ans<<endl;  
    return 0;  
}  

 

 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,