#617 E1 E2 CF

ピジョンは、二つの質問がないアイデアを始め、それを捨てる何日かわかりません。一昨日に問題の解決策を、それを拾い、再びそれを行います

E2はそれを見てください。独自のアイデアを持っている問題への統合ソリューション。まず、少なくともm個の色を厳密元ドロップ配列、セット長さmの最長シーケンスを見つけます。カラー<= M-1種の場合は、同じ色の2つの数の数mを持つ必要があり、順序を交換してはならない、それは確かに最後のシーケンス単調に降下はありません。その後、分割することができる色のM種類があります。ディルワース定理(emmmこの結論を許可が、知られていないであろう)に従うので、元のシーケンスは、ライン上の同じ色に染め低下しないM個のサブシーケンスに分割することができ、各サブシーケンスに低下しません。実際には、この質問は、サブシーケンスに分類されないどのように多くのブレークダウンすることができ、本質的に少なくとも

 

2つの賢い少し場所があります。

まず、Nが<= 100000を、直接ラインLISより少ない複雑さを求めるように見え、そしてnlogn LIS Haofanプログラムも格納されています。しかし、各要素の範囲は、1-26であり、使用済みPOS [I](1 <= l <= 26)とすることができる同一の要素ので、この位置に複数の位置を接続することができ、位置Iの最後の発生を節約しますこれは、より長い配列を減少させます。今回だけ複雑さO(26N)。第二に、いつでも染色ライン上の配列の染色ドロップDPアレイサブ要素​​値、DP配列の最大値をMであるため、同じ構成要素場合、それは単調降下であってはなりません。したがって、ちょうどメートルのシーケンスに該当しません

 

スーパーショートコード:

#include <ビット/ STDC ++。H>
名前空間stdを使用。
CONST INT MAXN = 200 + 10。
INT DP [MAXN]、POS [30]、[MAXN]; // POS [I]:文字I(1-26)最終位置に 
文字列s;
int型I、J、K、T、N。

メインint型()
{
	std ::イオス:: sync_with_stdio(偽);
	CIN >> N >> S;
	(; I <N; I ++ I = 0)するため
	  [I + 1] = S [i]が ' - ' + 1。
	memsetの(DP、0、はsizeof(DP))。
	memset(POS、0、はsizeof(POS))。
	DP [1] = 1; POS [1] = 1。
	{(; I <= N I ++ I = 2)のための
		DP [I] = 1。
		(; J <= 26、J ++ J = 1)のために
		  IF(POS [J]> 0 && J> [i])とDP [I] = MAX(DP [I]、DP [POS [J]] + 1)。
		POS [I] = I。
	}
	INT年= 0;
	ANS = MAX(DP [i]は、ANS);(; I <= N I ++ I = 1の)のための
	coutの<< ANS <<てendl;
	以下のために(; iが<= N-1、I 1 = I ++)COUT << DP [i]は<<」「。
	COUT << DP [N] << ENDL。
	0を返します。
}

  

そして、E1を見てください。E1は、彼が色を染めことができれば、もちろん、E2、E1の方法によって行うことができ、尋ね、かつn <200され、配列は、直接ラインにドロップして決定しました。しかし、問題の解決策は、私は非常に不思議な感じ貪欲な方法を提供し、脳はかなり右に感じMEND:設定された2つのサブシーケンスは、新しい要素が> =最後のサブシーケンスが、でも、後ろにそれを置くためにあれば、そこにあります最後のビットでも2〜> = IIバック、そうでない場合は解無しの場合......

 

コード

#include <ビット/ STDC ++。H>
名前空間stdを使用。
文字列s、ANS;

メインint型()
{
    int型I、J、N、F。
    CIN >> N >> S;
    文字last1、last2。
    last1 = ''; last2 = '';
    ANS = ""; F = 0。
    (; I <N; I ++ I = 0)するため
      {
      	IF(S [i]が<last1 && S [I] <last2){
      		COUT << "NO" << ENDL; F = 1。
      		ブレーク;
		  }
		IF(S [I]> = last1){
			年+ = '0';
			last1 = S [i]は、
		}
		そうであれば(S [I]> = last2){
			年+ = '1';
			last2 = S [i]は、
		}
	  }
	IF(F == 0){
		裁判所未満<< "YES" <<てendl;
	    coutの<< ANS <<てendl;
	}
	0を返します。
 } 

  

おすすめ

転載: www.cnblogs.com/edmunds/p/12357214.html