POJ 3186

ちょっと質問の意味。

アイデア:少し間隔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 
}

 

おすすめ

転載: www.cnblogs.com/tiberius/p/11291730.html