ポリゴンのゲーム - 間隔DP

タイトル説明

多角形(ポリゴン)が(図1に示す例では、N = 4)N頂点から成る所与の多角形の開始、ゲームをプレイするための単一のゲームで、各頂点は、整数値が割り当てられ、各+(加算演算)、または*(乗算)は、連続的に全ての側面は、N個の識別に1を整数:エッジはシンボルを与えました。画像

図1:ポリゴン第移動(最初の移動)のグラフィック表現は、一方の縁部を可能にするために削除され、後続の各シフト系列(subsequentmoves)、以下の工程を含みます:

図1に示すように、カップリングによってエッジEを選択し、頂点E V1とV2。

図2に示すように、新たな頂点に、エッジEと置換され、2つの頂点V1とV2が接続されています。新しい頂点が新しい値を与えられ、この値は、V1とV2であり、計算によって行わ指定Eは、結果が得られました。

すべてのエッジが頂点のみを残して、削除された後、ゲームは終了します。ゲームのスコアは、頂点の値です。以下では、ゲームの例である:多角形は、図1を検討します。

第3条の側面を削除するプレイヤーの最初のステップ。結果を図1に示します。 画像 物品3を削除する図2辺

その後、記事のプレイヤーの削除1つのエッジ  画像 品の3 1つの側の削除

次いで、物品第4の辺を削除  画像 図4記事4辺を削除

最後に、記事2辺の削除。スコアが0である  画像 最初のエッジを移動させ、可能な限り最高のスコアを算出し、任意の多角形のため、プログラムを作成し、最高スコアの結果の全てを含むことができる:第二側面部5図は、割り当てを削除します。

入力形式

POLYGON.INファイルは、頂点のNのポリゴンを与えています。2行を含むファイル:最初の行のレコードが値N(N <= 50)であると、第二行は、すべてのシンボルの辺(1、...、N)が与えられ、両者の間の頂点に嵌め込まれている含まれてい値(整数1、同時に側に接続された2つの頂点に対応する値、番号2に対応する第2の整数、3つの頂点側に接続している間; ...;に対応する、等。最後に、値Nの数、数は頂点の一方の側に取り付けられている間)、およびスペースで区切られたシンボル間の値。文字T(+に相当)(*に相当する)文字xは、:記号の双方が存在します。

出力フォーマット

ファイルPOLYGON.OUTの最初の行では、あなたのプログラムは、出力、入力ファイル中の最高スコアが条件を得ることができ、指定しなければなりません。いくつかのエッジが最初の移動中に削除された場合、それは最高のスコアにつながることができます。出力ファイルの2行目では、そのような特許請求の範囲はすべての側面、及び隙間によって分離された昇順に出力を含みます。

サンプル

サンプル入力

4
t -7 t 4 x 2 x 5

サンプル出力

33
1 2

データ範囲とヒント

サンプル入力は、図に示したポリゴンに対応します。第二行の最初の文字は、シンボル番号1側です。

同様に石を組み合わせたこの問題は、2つの* N + 1文字に、多角形環状鎖にNを変換します。

少しは少し後方に行くので、合計数は、変更することはできません。

一つのサイクルの前に、私たちはそのエッジを削除することを決定し、プラスnは、後方に行きます。

F [i] [j]は、iからjへの最適解を表します。

各点は、2点の構成、そうしなければならないI、J列挙分割点間隔、注目等しくない分割点Jに、

この問題なので、数字がマイナスの場合は、正作る考慮しなければならないだろう、正と負の両方持っています

例えば、-1000 -1000×100×100 = 1000000と1000000 = 10000> 10000が、100未満-1000を有します。

だから、すべての時間は、合併が最小値と最大値を考慮することがバインドされています。

次のマージ、記号「+」は、直接の最大値と最小値を追加する場合、

「*」の場合、それが最大値と最小値を探し、* 4本の少しの比較*大小の小、大*大*少し大きくなります。

 

 

コード

#include <iostreamの> 
する#include <cstdioを> 
する#include <cstdlib> 
の#include <CStringの> 
する#include <アルゴリズム>
 使用して 名前空間STDを、
int型 nは、集[ 150 ]、F [ 150 ] [ 150 ] [ 3 ]、和[ 150 ] [ 150 ]、FF [ 150 ] = { 0 }、MA、MB、A、B、C、D。
チャー FU [ 150 ]。
INT メイン()
{ 
    CIN >> N。
    int型 iは= 1、I ++; iが<= N。
    { 
        CIN >> FU [I] >>シュウ[I]。// 先输入符号、在输入数字
    }
     のためのint型 I = N + 1 ; iは= < 2 ; * N iが++ 
    { 
        シュウ[i]は [I-=シュウn]は、
        FU [i]は [I-FU = N]。
    } 
    のためにint型 i = 1 ; iがn = <; iは++ 
    { 
        ためINT O = 1 ; 0 <= 2 * N; O ++ 
        { 
            ためのint型 P = 1 ; p <= 2N- *; P ++ 
            { 
                F [O] [P] [ 1 ] = - 9999999 ; //が大きい値、の最小初期見つける 
                F [O] [P] [ 2 ] = 9999999 ; // 最大値を初期化、小さな値を見つけるを
            } 
        } 
        のためのINT Q = 1。 ; Q <= 2 * N-; Q ++)// 初期化部DP 
        { 
            F [Q] [Q] [ 1。 =] シュウ[Q]、
            F [Q] [Q] [ 2 ] = シュウ[Q];
             IF(FU [Q + 1 ] == ' T '
            { 
                F [Q] [Q + 1 ] [ 1 ] =シュウ[Q] +シュウ[Q + 1 ]。
                F [Q] [Q + 1 ] [ 2 ] =シュウ[Q] +シュウ[Q + 1 ]。
            } 
            もし(FU [Q + 1 ] == ' X ' 
            { 
                F [Q] [Q + 1 ] [ 1 ] =シュウ[Q] *シュウ[Q + 1 ]。
                F [Q] [Q + 1 ] [ 2 ] =シュウ[Q] *シュウ[Q + 1 ]。
            }
        } 
        のためにのInt L = 2 L ++; L <= N 
        { 
            ためINT J = I; J <=私はNLを+; J ++ 
            { 
                int型 K = J + L- 1。;
                 のためのINT X = J; X < K; X ++)//が、X + 1リアので、kより小さくなければならない
                {
                     IF(FU [X + 1 ] == ' T ' [&& F [J] [K] 。1 <F [J] [X] [ 1 ] + F [Xの+ 1 ] [K] [ 1 ])F [J] [K] [ 1 ] = F [J] [X] [ 1 ] + F [Xの+ 。1] [K] [ 1 ]。
                    もし(fuの[X + 1 ] == ' T ' && F [J] [K] [ 2 ]> F [J] [X] [ 2 ] + F [X + 1 ] [K] [ 2 ])F [J] [K] [ 2 ] = F [J] [X] [ 2 ] + F [X + 1 ] [K] [ 2 ]。
                    もし(fuの[X + 1 ] == ' X ' 
                    { 
                        A = F [J] [X] [ 1 ] * [X + F 1 ] [K] [ 1 ]。
                        B = F [J] [X] [2 ] * F [X + 1 ] [k]を[ 1 ]。
                        C = F [J] [X] [ 1 ] * F [X + 1 ] [K] [ 2 ]。
                        D = F [J] [X] [ 2 ] * [X + F 1 ] [K] [ 2 ]。
                        F [J] [K] [ 1 ] = MAX(MAX(MAX(a、b)は、MAX(C、D))、F [J] [K] [ 1 ])。
                        F [J] [K] [ 2 ] =分([J] [K] F分(MIN(A、B)、分(C、D))、[ 2 ])。
                    } 
                } 
            } 
        } 
        FF [I] = F [i]は[I + N-1] [ 1 ]。
    } 
    MA = - 1000000 int型 iは= 1 ; iが<= N; iが++)// 寻找最大值
    {
         場合(MA < FF [I])
        { 
            マサチューセッツ =のFF [I]。
            メガバイト = I; 
        } 
    } 
    COUT << MA << ENDL。
    以下のためにint型 i = 1 ; iは= N <; iは++ 
    { 
        場合(FF [I] == MA)
        { 
            COUT << I << "  " ; // 出力は、最初の数から外れてもよい
        } 
    } 
} 
/ * 
4 120 
X X 2、X 4 3 1 X 2 5 4 3 


。6 10000 
X X -10 -10 -10 T 10、T 10 X 10. 6 T 


7 300000 
X X -10 -10 -10 X X 10 -10 T 10、T 10、T 5 
試験データの三上記セット* /    

 

 

おすすめ

転載: www.cnblogs.com/fengwu2005/p/11289562.html