BoB004-H: Arithmetic Subsequence

2 secs 1024 MB
kyaneko999's icon kyaneko999

解説

N=1N=1 の時,AA 自身が等差数列になるので答えは 11 です.
N>1N>1 の時,初項が AiA_i,第 22 項が AjA_j1i<jN1\le i<j\le N)であるような部分列を考えます.
この部分列が等差数列になるならば,公差は d=AjAid=A_j-A_i と一意に定まります.
よって,以下のような操作により,初項が AiA_i,第 22 項が AjA_j の等差数列であるような部分列のうち長さが最大のものを構成できます.

  • 部分列 (Ai,Aj)(A_i,A_j) から始めて k=j+1,,Nk=j+1,\dots,N の順に AkA_k が現在の部分列の末尾よりちょうど dd 大きければ部分列の末尾に追加する.

i,j,ki,j,k それぞれについて O(N)O(N) の探索を行うことになるので,全体の計算量は O(N3)O(N^3) となります.

解答例(Python)