羅区P5774、キュートな動的なプログラミング。

かわいい、動的プログラミングは今までそれを見ましたか?

  私はその後、私はそれの動的なプログラミングソリューションの素敵な問題を書いて、あなたは、動的プログラミングの非常に好きですよ。

トピック:https://www.luogu.com.cn/problem/P5774

質問の意味:

  タイトルの意味での「非常に明確」。理由は人に感染し、ダイの数、あなたが病気を治すことができる兄の私の村の日を表し、それは村1日硬化を取り、あなたが一日の移動費やす必要があなたに、各番号のシーケンスを与えるために、頼む癒す:質問の意味少なくとも人々のすべての村が死にました。制限事項:私は、硬化前にI I-1から長い散歩のように、我々はすべての村を取る必要があります。

分析:

  この問題は、そのダイナミックな計画を参照してくださいするのは簡単ですが、それ(所要時間効率のnパーティー)、暴力計画nはどのような計画3が、我々はそれを解決することはできませんが、それがになっている:単調キュー?何も単調かのように。私たちは、他の方法を考えることができます:半分の答えを?どのように多くの人々 、それは非常に良い裁判官の死を行うことができ、または動的プログラミングに戻ることはないようです。

  列挙長は、出発点、ブレークポイント3が十分ではありません、我々は2を維持するために考えることはできませんか?

  レッツは、開始と長さを列挙する:それでは、どのように我々はそれを破る列挙するために行うのですか? - 無制限:私たちは、[J] [i]をDpとを定義する私は、死亡者の最小数にj個のI jに、すべてのプロセスのための良好な硬化を表し、そして私たちはメダルすることはできませんので、道路の要件は、i乃至jにiは、ブレークポイント、そしてなぜについて:それについて考える、私は私が最終的に関係なく、無価値Dpは停止して、私はこの期間動き回るどんなにも、何の死は存在しません、すべての村の硬化後jに私を置きます変更。

  そして、伝達方程式を思い付く(N-どのようにこれは派生ようになり、キーがある3が N-なり2

  DP [I] [J] = DP [I + 1]〜[J] +分((和[J] -sum [I])* 2、[I] *(D-1)* 3 +和[J ] -sum [I])。

  しかし、明らかにDpの[i]の[n]は、我々は1から1へnに持っていないので、途中で戻ることができます、私たちが望む最終的な結果ではありません。

  しかし、気にしない、我々は半分行っている、我々は、配列のDPを定義[i]は、元の村を硬化させた後、私、少なくとも1からn死者の数の合計を表し、あなたが見つける:長いほど、素晴らしいことだ開始点を列挙しません。その上に来るように方程式を転送します。

  DP [I] =分(DP [J] + Dpの[J + 1]〜[I] +(4 *(IJ)-2)*(和[N] -sum [I]))(J属于N *、 J <I)

  最後に、それは明らかDpの[n]は、我々が望むものを答えることです。

  とってもキュートな動的なプログラミング、我々はそれをよりダイナミックな愛を計画していませんか?

コード:

  それは非常に簡単です

書式#include <cstdioを> 
する#include < 文字列 > 
の#include <CStringの>
 使用して 名前空間はstdを、
CONST  INT MAXN = 3000 + 10 長い 長い[MAXN] [MAXN]、和、Dpは[MAXN] [MAXN]、DP [MAXN]。
int型のmain(){
     int型、nは 
    scanf関数(" %のD "、&N)
    以下のためにINT iが= 1 ; I <= N; I ++ ){ 
        scanf関数(" %のLLD "、および[I])。
        合計[I] =合計[I-1 ] + [I]。
    } 
    のためのint型 D = 2 ; D <= N; D ++ のためのINT iは= 1、J(J = I + D- 1)<= N; I ++ 
            Dpを[I] [J] = Dpの[I + 1 ] [J] +分((和[J] -sum [I])*(長い 長い2、[I] *(長い 長い)(D- 1)*(長い 長い3 +和[J ] - 和[I])。
    memsetの(DP、0x3fをはsizeof (DP))。
    DP [ 0 ] =0 ;
    以下のためにINT iが= 1 ; I <= N I ++ のためのINT J = 0 ; J <I、J ++ 
            DPを[I] =分(DP [I]、DP [J] + Dpの[J + 1 ] [ I] +((長い 長い4 *(長い 長い)(IJ) - (長い 長い2)*(和[N] - 和[I]))。
    printf(" %のLLD " 、DP [N])。
    リターン 0 ; 
}

ノーコメント、お兄が一目で理解してはなりません

スロットポイント:

  長い長い、あなたは私をからかっているとの死者。

エキス:

  その他の分析は、動的プログラミングは、何度も試すことができます。一度この質問の範囲の企画、線形計画として。

私たちは、次のとおりです。OIerは~~~、私たちが望む:AC ~~~、我々が必要:給油~~~!

おすすめ

転載: www.cnblogs.com/wish-all-ac/p/12615136.html