左から右に手立てDP DPを見つけていない、最大の自然は、私たちはデカルトツリープロセスの構築を検討することが考えられます。
L、Rの最大値iがあれば、線分を介して私のポイントは、すべてのiが列挙されたときに廃棄することができます。
DP [I] [J] [k]が唯一の懸念私ことを示している - 最大点とjとの間の線分を得ることができる、来る伝達方程式を書くことは容易です。
また、ネットワークに流れて書くようだが、しません。。
#include <ビット/ STDC ++ H> 使用して名前空間STDを、CONSTのINT N = 50 + 7 。int型、H、M、N。 INT ヴァル[N] [N] [N] [N]。 INT DP [N] [N] [N]。INT DFS(INT L、のint R、int型アップ){ 場合(最大< 0 || L> R)戻り0 ; INT&ANS = DP [L] [R] [最大]。 もし(〜ANS)の戻りANS; ANSは =のDFS(L、R、アップ- 1 )。 以下のための( int型 J =リットル; J <= R。J ++ ){ int型 TMP =ヴァル[L] [R] [J] [最大- 1 ] +アップ* アップ。 TMP + = DFS(L、J - 1 、上)。 TMP + = DFS(J + 1 アップ、R)。 ANS = MAX(ANS、TMP)。 } 戻りANS。 } int型のmain(){ memsetの(DP、 - 1、はsizeof (DP))。 scanf関数(" %D%D%D "、&N、&H&M)。 以下のために(int型私= 1 ; I <= M、I ++){ int型のL、R、X、C。 scanf関数(" %D%D%D%D "、&L&R&X、&C) 以下のために(int型 i = 1 ; iが= Lを<; iは++ ){ ため(INT J = Rあり、j <= nであり、j ++ ){ ための(int型、kは<= R、K = L kは++ ){ ヴァル[I] [ J] [K] [X] - = C。 } } } } のための(int型 i = 1 ; iが<= N; iが++ ){ ため(int型 J = I; J <= nであり、j ++ ){ ための(int型 K = I; K <= J; ++ kは){ ため(INT Z = 1 ; Z <= hの; Z ++ ){ ヴァル[I] [J ] [K] [Z] + = valの[I] [J] [K] [Z - 1 ]。 } } } } のprintf(" %d個の\ n "、DFS(1 、N、H))。 リターン 0 ; } / * * /