自分を想像してポータルに
問題の解決策
私たちは、このトピックにタグを見たとき、私たちは、これが水問題DPの範囲であることを知っています
明らかに、この間隔は、時間の間隔を指し、
私たちは、[i] [j]は最小コストエイリアンは私〜jの間のすべての時間を破壊表しDP
明らかにこのような大きなオープントーナメントの二次元アレイよりも劣りません
だから、すぐに離散見た後??
状態遷移方程式DP [I] [J] =分(DP [I]、[J]、DP [I] [K-1] + DP [K + 1]〜[J] +エイリアン[ID] .D)
コード
書式#include <cstdioを> する#include <CStringの> の#include <アルゴリズム> 使用して 名前空間はstdを、 構造体otherpeople { int型、B、D。 }エイリアン[ 305 ]。 INT DP [ 2000 ] [ 2000 ]、LS [ 10010 ]、N、T、CNT。 テンプレート <型名E>インラインボイド読み取る(E&X) { X = 0 ;登録INT F = 1。チャー CH = GETCHAR()。 しばらく(CH> ' 9 '|| CH < ' 0 '){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();} 一方(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)、CH = GETCHAR();} X * = F。 } int型のmain() { 登録INT LEN、ID、I、J、K、Qは、 (t)を読み出します。 一方、(t-- ) { (N)を読み出し、CNT = 0; memsetの(DP、0、はsizeof (DP))。 memset(LS、0、はsizeof (LS))。 用(i = 1 ; iが<= N; ++ I)、(外国人[I] .D)、LS [エイリアン[Iを読み取り、(.B [I]エイリアン)読み出す([i]は.Aエイリアン)読み取ら] .A = 1、LS [エイリアン[i]は.B] = 1 。 用(i = 1 ; I <= 10000 ; ++ I)であれば(LS [i])とLS [I] = ++ CNT。 以下のための(I = 1エイリアン[I] .A = LS [エイリアン[I] .A]、エイリアン[i]は.B = I ++; iが<= N)LS [i]は.B [エイリアン]。 用(LEN = 1 ; LEN <CNT; ++ LEN) 以下のための(I = 1、J <= CNT; ++ J、++、J = iがLENを+ I) { ID = - 1 。 用(Q = 1 ; Q <= N; ++ Q)場合(I <=エイリアン[Q] .A && J> =エイリアン[Q] .B &&(ID == - 1 ||エイリアン[ID] .D <エイリアン[Q] .D))ID = Q。 もし - (のid == 1)続けます。 DP [I] [J] = 0x7fffff 。 用(K =エイリアン[ID] .A; K <=エイリアン[ID] .B; ++ K)DP [i] [j]は=分(DP [I]、[J]、DP [I] [K- 1 ] + DP [K + 1 ] [J] + エイリアン[ID] .D)。 } のprintf(" %Dを\ n "、DP [ 1 ] [CNT])。 } 戻り 0 。 }