主な問題は、配置され、この情報ではなく、列の数であります
行ごとに配置されていることを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 ; }