ちょっと質問の意味。
アイデア:少し間隔DPの意味。
いくつかのために補間による区間[1、i]と間隔[J、N]を得ることができる最大値:私はDP [i] [j]が表すします。
状態遷移式:DP [I] [J] = MAX(DP [I - 1]〜[J] + V [I] *(iはNを+ - J + 1)、DP [I]、[J + 1] + V [j]は*(I +はN - J + 1))。
コードは以下の通りであります:
#include <iostreamの> する#include <アルゴリズム> の#include <cstdioを> する#include <CStringの> 使用して 名前空間STD。 const int型 MAXN = 2005 ; const int型 Fは= 0x3fをします。 const int型 INF = 0x3f3f3f3f 。 INT N、V [MAXN]、DP [MAXN] [MAXN]。 INT メイン(){ 一方(scanf関数(" %のD "、&N)== 1 ){ ため(int型 i = 1 ; iが<= N; ++ I)のscanf("%のD "、&V [i])と、 のmemset(DP、 - 1、はsizeof (DP)); DP [ 0 ] [N + 1 ] = 0 ; のため(int型 I = 0 iは= Nを<; ++ I){ ため(INT J = N + 1、J> = 1 ; - J){ 場合(私の== 0 && J == N + 1)継続; INTその1 = I - 1 > = 0?DP [私 -1 - ] [J] +のV [i]は*(J + iがN + 1): - 1 。 int型その2 = J <= N?DP [I]、[J + 1 ] + V [j]は*(iがN + - J + 1): - 1 。 DP [I] [J] = MAX(その1、その2)。 } } int型 ANS = 0 。 以下のために(int型 i = 0 ; iは= Nを<; ++ I)ANS = MAX(ANS、DP [i]は[I + 1 ])。 printf(" %d個の\ n " 、ANS)。 } 戻り 0 。 }