タイトル説明
Illyasviel:「あなたは最も長いシーケンスにそれをドロップしたくないですか?」
スターダスト:「まあ!」
Illyasviel:「ボスは、最大に、私のシーケンスの全体の2つの最長の下落を与えることはありません。」
配列は見つけ 互いに素なサブシーケンス内の2つが低下し、要素とその最大、配列は空であってもよいことはありません。
注1:のシーケンス 定義が低減されていない不在L <R&LT 及び L > R&LT
注2:の不在:2つの互いに素のサブシーケンスは以下のように定義されている I も第2のサブシーケンスで、即ち、第1サブシーケンス。
説明を入力します。
番号の最初の行 のn 系列の代表的な 長さa。
次のラインの 数N の数のI代表 I 。
データ範囲:
- 2 ≤ N ≤ 5 0 0
- 1 ≤ A iは≤ 1 0 5
出力説明
線aは要素および最大値をドロップしない2つの互いに素の配列の整数を表します。
サンプル入力1
9 5 3 2 1 4 2 1 4 6
サンプル出力1
22
プロンプト
サンプルは説明しました:
第一の配列は「5」から選択されます
第二の配列は、「3446」から選択され、
合計 2 2
https://cometoj.com/contest/48/problem/B
LIS 2次元変種最大互いに素シーケンスを必要と増加しました。
非常に良い質問。類似しているが、二次元、DPに拡張ここで一次元思考とLIS [I] [j]は、それぞれI、Jが最大の端部である二つの配列を表し、ダブル介してケースI、Jを列挙する。
ある微妙な性質は:i、jは列挙の場合には同じになりますが、添字jを持つkのDPあり、k =私はすなわち、2に等しくないので、ここで確実にアップデートが唯一のケースが!交差しませんシーケンスの2つの要素があります。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 INT [ 505 ]。 int型の DP [ 505 ] [ 505 ]。 INT のmain() { int型N、M、I、J、K。 scanf関数(" %のD "、&N) 用(i = 1 ; iが<= N; iは++ ){ scanf関数(" %のD "、および[I])。 } ため(k = 1 ; kは<= nであり、k ++ ){ ための(I =0、I <K; iは++ ){ ため(J = 0 ; J <K、J ++ ){ 場合([i]が<= A [K]){ DP [K] [J] = MAX(DP [K] [J]、DP [I] [J] + [K])。 } もし([J] <= [K]){ DP [I] [K] = MAX(DP [I] [K]、DP [I] [J] + [K])。 } } } } int型 ANS = 0 。 用(i = 1 ; iが<= N; iは++ ){ ため(J = 1 ; J <= N; J ++){ ANS= MAX(ANS、DP [I] [J])。 } } のprintf(" %d個の\ n " 、ANS)。 リターン 0 ; }