滞在するzzn高齢者のがん問題......
まず、この質問は、最初の性質を理解します:
我々は、高さ間隔を長くすることを選択した場合、我々が必要とするため、我々は、全体n個増加の左端に選択した点を増やす必要があります
最後に、それは損失でお金を失うことはありませんように単調、最大長のシーケンスの減少に。。。。
その後、我々は、この問題の最後の点の最適な高さを決定[N] + Kで見出さ
配置されたアレイを意味F [j]は[k]は、操作のkはトウモロコシ高さjの現在のシーケンスの最大長を表します。
そして、我々は3話の部分の順序として表示この質問を置くことができます。
トウモロコシIの1.現在の位置、1-I-1転写によって
2.現在のトウモロコシの高さjは、1-jがから転送しました
3.現在のトウモロコシは、転写1-K-1、Kが操作されました
フェンウィックツリーのメンテナンス、K、(明らかに.....)とJ
(そう私たちの最初のループは、このように私たちの私が注文されることを確実にする、配列に書き込む必要がない、iは、メモリを節約するために、
実際には、I、J、K、必要に応じて、2はOKですが、まあメモリを節約するために.......)
注意点:
1.ときは逆サイクルk(kは明らかまあ.....現在の正のシーケンスならば、彼の挿入はビットkの現在の列挙に影響を与えます)
2.前処理はもちろん、することはできません、あなたの列挙に基づいに注意を払う必要があります
3.ans値は必ずしも最後のポイントを選択されていません
1つの#include <地図> 2の#include <iostreamの> 3の#include <cstdioを> 4の#include <CStringの> 5の#include <アルゴリズム> 6の#include <cmath> 7の#include < ストリング > 8の#include <ベクトル> 9 #定義 int型、長い長い 10を 使用して 名前空間はstdを、 11 int型 C [ 511 ] [ 5501 ]。 12 INT [ 11001 ]。 13 int型MAXN。 14 int型 lowbit(int型X){ 返す - X&(; X)} 15 のint ; N-、K 16 空隙追加(int型 X、int型の Y、int型)SUM // Xいくつかの動作の高さのk y k番目の操作の 17 { 18である ため(int型 I = X; Iは<= K + 1、I + = lowbit(I)) 19。 { 20である ため(INT J = Y; J <= MAXN + K; J + = lowbit(J)) 21は 、{ 22である C [I] [J] = MAX(C [I]、[J]、SUM); 23である } 24 } 25 } 26 int型の照会(int型のx、int型のY) 27 { 28 INT ANS = 0 。 29 のために(int型 ; I> = I = xで1 I- =; lowbit(I)) 30 { 31の ための(INT J = yであり、j> = 1 ; J- = lowbit(J)) 32 { 33の ANS = 最大(ANS、C [I] [J])。 34 } 35 } 36の リターンANS。 37 } 38 INT ANS =0 ; 39は、 メイン()符号付き 40 { 41 のscanf(" %のLLDの%のLLD "、&N&K)を、 42 のために(int型 I = 1 ; ++; iが<= N I) 43 { 44 のscanf(" %のLLD "、および[I])。 45 MAXN = MAX([I]、MAXN)。 46 } 47 のための(int型 i = 1 ; iは= N <; ++ I) 48 { 49 のために(INTJ = K; J> = 0 ; - j)の 50 { 51 INT番目=クエリ(J + 1、[I] + J)+ 1 ; 52 // のprintf( "DP [%のLLD] [%のLLD] =%LLDする\ n"、J、[I] + J)。 53の ANS = MAX(目、ANS)。 54 追加(J + 1、[I] + J、TH)。 55 } 56 } 57 // INT ANS =クエリ(K + 1、[N] + K)。 58 のprintf(" %LLDする\ n " 、ANS)。 59 }