CF463D Gargariおよび順列(LCS)

主な問題は、配置され、この情報ではなく、列の数であります

行ごとに配置されていることを1-nは、異なる位置の数であり、我々は、1000Nを観察し

2つの配列の数は、公開することができる場合には最長共通サブシーケンスのために考慮して、すなわち、各列にそしてある数の後ろに別の番号であります

彼らは、移転前からF [j]は、既存から転送される前に私が終わる最長共通部分列を表し、転送時には、時間のみがk個されている[i]はDPステータスFを設計し、我々はそう、または他の1、およびJ各行iの前に各行

書式#include <iostreamの> 
の#include <CStringの> 
の#include <cstdioを> 
する#include <マップ> 
書式#include <アルゴリズム> 
書式#include <キュー> 
の#include < 設定 >
 の#define ULL符号なしの長い長い
 使用して 名前空間はstdを、
typedefの長い 長いLL。
ペアのtypedef < int型int型 > PLL。
CONST  INT N = 1E5 + 10 INT F [N]。
INT POS [ 6 ] [N]。
int型 [ 6] [N]。
INT CNT [N]。
ベクトル < int型 > NUM;
int型のmain(){
     int型のn、kは、
    CIN >> N >> K。
    int型私は、
    int型J;
    以下のために(iは= 1 ; I <= K; I ++ ){
         ため(J = 1 ; J <= nであり、j ++ ){ 
            scanf関数(" %のD "、および[I] [J])。
        } 
    } 
    int型 RES = 0 ための式(I = 1 ; iが<= N; iが++ ){
         ため(J = 1 ; J <= K; J ++ ){
             int型の記号= [J] [I]; 
            CNT [記号] ++ ; 
            POS [J] [記号] = I。
            もし(CNT [サイン] == K){
                 int型のL。
                もし(num.empty()){ 
                    F [記号] = 1 
                } 
                {
                     (L = 0 ; L <num.size(); L ++ ){
                         int型R。
                        int型フラグ= 0;
                        以下のための(R = 1 ; R <= K; R ++ ){
                             場合(POS [R] [サイン] < POS [R] [NUM [L]]){ 
                                フラグ = 1 休憩; 
                            } 
                        } 
                        もし(フラグ)
                            F [記号] = MAX(F [サイン]、1 )。
                        { 
                            F [記号] = MAX(F [サイン]、F [NUM [L] + 1 )。
                        } 
                    }

                } 
                num.push_back(サイン)
                RES = MAX(RES、F [記号])。
            } 
        } 
    } 
    COUT << RES << ENDL。
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/ctyakwf/p/12637274.html