1 条题解

  • 0
    @ 2023-6-11 12:16:31

    C :

    #include<stdio.h>
    #define max(a,b)	(a>b?a:b)
    #define	min(a,b)	(a<b?a:b)
    int n;
    int a[110],f[110],l[110],ans=99999;
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    	{
    	scanf("%d",&a[i]);
    	f[i]=l[i]=1;
    	}
    	for(int i=n-1;i>=1;i--)
    	for(int j=i+1;j<=n;j++)
    	if(a[i]>a[j])
    	f[i]=max(f[j]+1,f[i]);
    	for(int i=2;i<=n;i++)
    	for(int j=1;j<=i-1;j++)
    	if(a[i]>a[j])
    	l[i]=max(l[j]+1,l[i]);
    	for(int i=1;i<=n;i++)
    	{
    	ans=min(ans,n-f[i]-l[i]+1);
    	}
    	printf("%d",ans);
    	return 0;
    } 
    

    C++ :

    #include<iostream>
    using namespace std;
    
    //比较两个数的大小,返回较大的数
    int max(int a,int b)
    {
        if(a >= b)
            return a;
        else
            return b;
    }
    
    int main(){
    	
    	int a[101];//用于存放学生身高
    	int dpa[101];//用于存放学生数从0到n,的最长递增子序列
    	int dpb[101];//用于存放学生数从n到0,的最长递增子序列 
    	int n;//n各学生 
    	cin>>n;
    
    	for(int i=0;i<n;i++){
    		cin>>a[i];
    	}
    		
    	//初始化dpa dpb
    	for(int i=0;i<n;i++){
    		dpa[i]=1;
    		dpb[i]=1;
    	} 
    	
    	//从左边开始,求以第i个人为终点的,最长升序子序列长度 
    	for(int i=1;i<n;i++){
    		//遍历i以前的数 
    		for(int j=0;j<i;j++){
    			//一旦 第i个人的身高比第j个人的身高高 
    			if(a[i]>a[j]){
    				// dpa[j]:代表到第j个人的最长升序子序列,+1 代表再加上第i个人 
    				dpa[i] = max(dpa[j]+1,dpa[i]);  
    			}
    		}
    	}
    	
    	//从右边开始,求以第i个人为终点的,最长升序子序列 
    	for(int i=n - 1;i>=0;i--){  
            for(int j=n-1; j>i;j--){  
                if(a[i]>a[j])  
                    dpb[i]=max(dpb[j]+1,dpb[i]);  
            }  
        }  
        
        int Max=0;
        //求左边+右边 值最大的队列 则为 最长的合唱队型 人数 
        for(int i=0;i<n;i++){
        	Max=max(Max,dpa[i]+dpb[i]-1);	
    	}
        
        cout<<n-Max<<endl;
    }
    
    
    • 1

    信息

    ID
    2214
    时间
    1000ms
    内存
    16MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者