zoukankan      html  css  js  c++  java
  • 【tyvj】【dp】合唱队型

    描述

        N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。

        合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,  则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。

        你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

    输入格式

       输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。

    输出格式

        输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

    思路

    正着一遍最长上升子序列,倒着一遍最长上升子序列,每一个位置的价值为在该位置的两个dp值之和减一,求这个价值的最大值,N-max{sumdp}即为答案

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #define INF 0xfffffff
    #define REP(a,b) for(int i=a;i<=b;i++)
    #define RES(a,b) memset(a,b,sizeof(a))
    using namespace std;
    
    int n,t[120],dp1[120],dp2[120],val[120],ans=0;
    
    int main(){
    	RES(dp1,0); RES(dp2,0);
    	scanf("%d",&n);
    	REP(1,n) scanf("%d",&t[i]);
    	REP(1,n){
    		dp1[i]=1;
    		for(int j=1;j<i;j++){
    			if(t[j]<t[i]) dp1[i]=max(dp1[i],dp1[j]+1);
    		}
    	}
    	for(int i=n;i>=1;i--){
    		dp2[i]=1;
    		for(int j=n;j>i;j--){
    			if(t[j]<t[i]) dp2[i]=max(dp2[i],dp2[j]+1);
    		}
    	}
    	REP(1,n) {
    		val[i]=dp1[i]+dp2[i]-1;
    		//printf("dp1[%d]=%d dp2[%d]=%d
    ",i,dp1[i],i,dp2[i]);
    		ans=max(ans,val[i]);
    	}
    	printf("%d",n-ans);
    	return 0;
    }

  • 相关阅读:
    获取其他线程的数据用 queue, 多进程Q
    self: 限制并发量asyncio
    asyncio 中给running 的loop 动态添加 Future Task
    雾里看花之 Python Asyncio
    python协程之动态添加任务
    异步IO( asyncio) 协程
    加快phpstorm、rubymine、pycharm系列IDE运行速度的方法
    scrapy 'fcntl' has no attribute 'F_GETFD
    sitemap index
    Django模板系统 运算
  • 原文地址:https://www.cnblogs.com/leotan0321/p/6081418.html
Copyright © 2011-2022 走看看