牛のスナック

题目描述FJは、牛乳の膨大な量を与えるためのお金を得るための牛N(1 <= N <= 2000)おいしいお菓子を購入しました。FJは日ごとに1つの御馳走を販売しているし、彼は与えられた期間の時間をかけて受け取るお金を最大化したいと考えています。

おやつは、多くの理由から興味深いものです:お菓子は、両端が開放されて、長いボックスで単一のファイルに1..Nと保存された順番に番号が付けられています。任意の日には、FJはtreats.Like上質なワインとおいしいチーズの彼の隠し場所のいずれかの端から1つの御馳走を取得することができ、扱いは年齢とともに改善し、より大きなprices.Theの扱いが統一されていないコマンド:いくつかは優れていると高い本質的な価値を持っています。a.Given年齢の御馳走のためにA *牛は、V(i)を支払うことになります:私は、値v(I)(1 <= V(I)<= 1000).Cowsが長い古くなったお菓子のために多くを支払うた治療そのボックスにインデックスiの順に並んだお菓子のそれぞれの値v(I)、彼が最適に彼らの販売を注文した場合FJが彼らのために受け取ることができる最大の価値とは何でしょうか?

最初の治療は、1日目に販売され、年齢A = 1を有しています。後続の各日は1で、年齢が増加します。

ジョンは、多くの場合、牛の高乳量のための特別な手当をした、とすぐに牛は私が過ごすする方法がわからない多額の資金を持っています。このような理由から、ジョンはN(1≤N≤2000)コピー牛を販売する美味しいスナックを購入しました。ジョンは毎日軽食を販売しました。これらすべてのスナックは、最大の利益を得るために売却した後、ジョンは確かに願っています。これらのスナックは興味深い特徴を次のようしています。

スナックに従い•1。長いボックスの行にあるN個の番号、。ボックスは、両端ジョンの各開口を有します

当日は、最も外側の箱のどちらかの端から除去することができます。

•ワインとおいしいチーズ、長いこれらのスナック店よりおいしいと同様に。もちろん、そうジョンは彼らに高い価格を販売することができます。

•必ずしも各スナックの初期値と同じ。ときにジョン・購入、Viのためのi番目の初期値スナック(1≤Vi≤1000)。

•それは買った後の日で売らi番目のスナックは、その価格はVI×された場合。

Viはダウンi番目の初期値のスナックの上からボックスです。ジョンは、すべてのスナックの初期値を告げた、とあなたは彼が最もお金を得ることができますどのくらい、これらのスナックのすべてが販売された後、彼は、計算することができます願っています。

入力フォーマットの1行目:単一の整数、N

ライン2..N + 1:回線I + 1が御馳走V(i)の値が含まれています

出力形式の1行目:最大収入FJはお菓子を販売して達成することができます

入力出力入力サンプル#1のコピー513 152 43説明コピーサンプルの出力#1 /プロンプト説明:

ファイブ扱います。初日FJは、販売のいずれか#1(値1)を治療または#5(値2)を扱うことができます。

FJは扱い(値1、3、1、5、2)インデックスの次の順序でを販売している:1、5、2、3、4、1×1 + 2×2 + 3×3 + 4×1 + 5×5 = 43を作製します。

 

#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの> 
する#include <アルゴリズム>
 使用して 名前空間STDを、
int型 nは、ANS、V [ 2020 ]、H [ 2020 ] [ 2020 ]。
INT DFS(INT S、int型のx、int型のY){
     場合(Y < X){
         戻り 0 
    } 
    もし(H [X] [Y]){
         戻りH [X] [Y]。
    } 
    H [X] [Y] = MAX(DFS(S + 1、X + 1、Y)+のS *のV [x]は、DFS(S +1、X、Y- 1)+ S *のV [Y])。
    戻りH [X] [Y]。
} 
int型のmain(){ 
    scanf関数(" %のD "、&N)
    以下のためにint型 i = 1 ; iが<= N; iが++ ){ 
        scanf関数(" %dを"、&V [I])。
    } 
    DFS(11 、N)
    printf(" %dの"、H [ 1 ] [N])。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/hrj1/p/11141044.html