描述
乙個多邊形,開始有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...