zoukankan      html  css  js  c++  java
  • P4728 [HNOI2009]双递增序列

    链接P4728 [HNOI2009]双递增序列

    • (f_{i,j})表示当前考虑第(i)个数,上一步是(a_{i-1})接在后面的序列一共取了(j)个数,另外一个序列的末尾最小值。
    • 转移:如果(a_i<a_{i-1}),那么上一步是(a_{i-1})接在后面的序列可以继续接,即(f_{i,j}=f_{i-1,j-1})
    • 否则若(a_i>f_{i-1,i-j}),也就是在(i-1)这个位置的时候,另外一个序列的结尾要比当前小,那么有(f_{i,j}=a_{i-1}),也就是另一个序列和这个序列交换位置,也就是原来的另一个序列接上了(a_i),那么本来接上(a_{i-1})的序列就要变成值域表示,而现在的序列就变成下标表示了。
    • 所以另外一个序列的末尾最小值就是上一步接在(a_{i-1})的序列。
    #include<bits/stdc++.h>
    #define R register int
    #define db double
    using namespace std;
    const int N=2501;
    int q,n,w[N],f[N][N];
    int gi(){
        R x=0,k=1;char c=getchar();
        while(c!='-'&&(c<'0'||c>'9'))c=getchar();
        if(c=='-')k=-1,c=getchar();
        while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();	
        return x*k;
    }
    void sol(){
    	n=gi();
    	for(R i=1;i<=n;++i)w[i]=gi();
    	memset(f,63,sizeof(f));
    	f[1][0]=w[1],f[1][1]=0;
    	for(R i=2;i<=n;++i){
    		f[i][0]=w[i];
    		for(R j=1;j<=i&&j<=n/2;++j){
    			if(w[i]>w[i-1])f[i][j]=min(f[i][j],f[i-1][j-1]);
    			if(i>=j&&w[i]>f[i-1][i-j])f[i][j]=min(f[i][j],w[i-1]);
    		}
    	}				   
    	if(f[n][n/2]==f[n+1][0])puts("No!");
    	else puts("Yes!");
    }
    int main(){
    	q=gi();
    	while(q--)sol();
    	return 0;
    }
    
    
  • 相关阅读:
    docker 安装 clickhouse单机版
    CockRoachDB简介
    Ubuntu18.04 LTS Cockroach集群搭建
    ClickHouse 的一些优化参数
    ClickHouse 概念整理
    OOM Killer机制
    win10系统下载地址
    Quartz.Net在C#中的使用
    JavaScript的undefined与null、NaN的区别
    Java Web基础回顾 —JSP
  • 原文地址:https://www.cnblogs.com/Tyher/p/9853296.html
Copyright © 2011-2022 走看看