POJ1651乗算パズル(検索メモリセグメントDP +)

乗算パズルは、それぞれが単一の正の整数を含む、カードの行で再生されます。移動プレイヤーの間の点の数が取らカードおよびカード上の数字の左に、それの右側の数の積に等しい行のうちの一枚のカードを取り、得点。なお、第1および行の最後のカードを取り出すことはできません。最終移動した後、2つだけのカードが一列に残っています。

目標は、獲得ポイントの合計数を最小化するような順番にカードを取ることです。

行のカードは数字10 1 50 20 5を含む場合、例えば、プレイヤは、1、次に20と50との得点をカードがかかる場合があります
10 * 1 * 50 + 50 * 20 * 5 + 10 * 50 * 5 = 500 + 5000 + 2500 = 8000

彼は逆の順にカードを取る場合は、その後、50、20、1、すなわち、スコアは以下のようになります
* 50 * 20 + 1 * 20 * 5 + 10 * 1 * 5 = 1000 + 100 + 50 = 1150 1。

入力

入力の最初の行は、カードの数N含有(3 <= N <= 100)。2行目は、スペースで区切られた1から100の範囲の整数Nを含有します。

出力

最低限のスコア - 出力は一つの整数を含まなければなりません。

サンプル入力

6 
10 1 50 50 20 5

サンプル出力

3650は、
最後に水の比較期間DPに遭遇し、タイトルと最高の連鎖行列積は似ています。まず後方分析、確かに唯一の3つの数字、2程度である数と最後の操作の最後の残り動作時間の固定数。選択する数としては、意思決定プロセスである、右1〜1 +左列挙することが必要であり、選挙の後、いくつかの考慮事項は、プロセスについてどのように転送、脳のシミュレーションから来るべきで、伝達方程式を起動することができるようになりますDPを[リットル] [R] =分(DP [L] [R]、工程(L、I)+工程(I、R)+ [I] * [L] * [R])、 再帰的に解く境界長さは、長さの後、3つの値[L] * [L、次に2、0の値であり 、+ 1] * [R] DPメモリアレイと。最後に、需要はDP [1]〜[N]です。
#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの>
 使用して 名前空間STD;
 INT N-、A [ 105 ]、DP [ 105 ] [ 105 ]; // 最後の残りの左右端部がなければならない
INTプロセス(INT L、INT R&LT)
{ 
    IF(L用+ 1 == R&LT)
    { 
        DP [L] [R&LT] = 0 ;
         戻り 0 ; 
    } 
    IF(L + 2 == R&LT)
    { 
        DP [L] [R&LT] = A [L] * [L +1 ] * [R]。
        戻りDP [L] [R]。
    } 
    int型のI;
    もし(!DP [L] [R] = 0x3f3f3f3f戻りDP [L] [R]。
    以下のために(私はL + = 1 ; I <= R- 1 ; I ++ 
    { 
        DP [L] [R] =分(DP [L] [R]、工程(L、I)+工程(I、R)+ A [I] * [L] * [R])。
    } 
    戻りDP [L] [R]。
 } 
int型のmain()
{ 
    CIN >> N。
    int型私は、
    memsetの(DP、0x3f3f3f3fはsizeof (DP))。
    以下のために(iは= 1 ; iが<= N; I ++)のscanf(" %dの"、および[I])。
    COUT <<工程(1 、N)
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/lipoicyclic/p/12521572.html