多邊形遊戲(經典的環形dp)

2021-07-01 20:51:47 字數 1303 閱讀 8837

描述

乙個多邊形,開始有n個頂點。每個頂點被賦予乙個正整數值,每條邊被賦予乙個運算子「+」或「*」。所有邊依次用整數從1到n編號。

現在來玩乙個遊戲,該遊戲共有n步:

第1步,選擇一條邊,將其刪除

隨後n-1步,每一步都按以下方式操作:(1)選擇一條邊e以及由e連線著的2個頂點v1和v2; (2)用乙個新的頂點取代邊e以及由e連線著的2個頂點v1和v2,將頂點v1和v2的整數值通過邊e上的運算得到的結果值賦給新頂點。

最後,所有邊都被刪除,只剩乙個頂點,遊戲結束。遊戲得分就是所剩頂點上的整數值。那麼這個整數值最大為多少?

輸入 第一行為多邊形的頂點數n(n ≤ 50),其後有n行,每行為乙個整數和乙個字元,整數為頂點上的正整數值,字元為該頂點到下乙個頂點間連邊上的運算子「+」或「*」(最後乙個字元為最後乙個頂點到第乙個頂點間連邊上的運算子)。

輸出 輸出僅乙個整數,即遊戲所計算出的最大值。

題解:

非常經典的環形dp

首先我們可以發現刪掉的邊數一定是n-1,這樣的話操作序列其實是一條包含n個頂點的鏈。

這個圖可以分成一些長度為1,2,3…n的鏈,這裡的長度指的是鏈所包含的定點數。

我們設f[i][j][0]為以頂點i為起點,長度為j的鏈的最大值。

f[i][j][1]為以頂點i為起點,長度為j的鏈的最小值。

那麼我們最後的答案就是f[i][n][0] (1<=i<=n);

現在考慮轉移。

轉移也是用的非常經典的方法。

列舉從當前鏈的那條邊斷開,由於斷開的兩條子鏈我們已經算出來了,所以就滿足了最優子結構。

值得注意的地方是如果斷開的那條邊上的運算子是乘號,由於資料中可能有負數,所以會出現負負得正的情況

設子鏈a的最小值為x最大值為y,子鏈b的最小值為xx,最大值為yy

則該鏈的最大值為max(x*xx , x*yy, y*xx , y*yy);

最小值為min( x*xx , x*yy, y*xx , y*yy);

因為是環形,所以算頂點的時候需要模n;

#includeusing namespace std;

int n,v[1001],f[101][101][2],temp,a,b,c,d,ans,tt;

char op[1001],ch;

int main()

if (ch=='*')

}ans=-100000000;

for (int i=1;i<=n;i++)

ans=max(ans,f[i][n][1]);

cout<}

多邊形遊戲(DP)

多邊形遊戲是乙個單人玩的遊戲,開始時有乙個由n個頂點構成的多邊形。每個頂點被賦予乙個整數值,每條邊被賦予乙個運算子 或 所有邊依次用整數從1到n編號。遊戲第1步,將一條邊刪除。隨後的n 1步按以下方式操作 1 選擇一條邊e以及由e連線著的兩個頂點v1和v2 2 用乙個新的頂點取代邊e以及由e連線著的...

多邊形遊戲

07 多邊形遊戲 描述乙個多邊形,開始有n個頂點。每個頂點被賦予乙個正整數值,每條邊被賦予乙個運算子 或 所有邊依次用整數從1到n編號。現在來玩乙個遊戲,該遊戲共有n步 最後,所有邊都被刪除,只剩乙個頂點,遊戲結束。遊戲得分就是所剩頂點上的整數值。那麼這個整數值最大為多少?關於輸入 第一行為多邊形的...

多邊形遊戲

該問題用動態規劃中的最優子結構來解決,當把一條邊去除除后,再把它拉直,那麼這個問題就最後可以變成一條鏈。那麼就和以前寫的矩陣連乘問題和凸多邊形最優三角剖分相似,最後要求的是這個鏈的表示式算式結果的最大值。於是我們就可以想到可以用陣列p i j 來表示從點i開始,鏈長為j的算術表示式的最大值,用v i...