問題描述:
多邊形遊戲是乙個單人玩的遊戲,開始時有乙個由n個頂點構成的多邊形。每個頂點被賦予乙個整數值,每條邊被賦予乙個運算子「+」或「*」。所有邊依次用整數從1到n編號。
遊戲第1步,將一條邊刪除。
隨後n-1步按以下方式操作:
(1)選擇一條邊e以及由e連線著的2個頂點v1和v2;
(2)用乙個新的頂點取代邊e以及由e連線著的2個頂點v1和v2。將由頂點v1和v2的整數值通過邊e上的運算得到的結果賦予新頂點。
最後,所有邊都被刪除,遊戲結束。遊戲的得分就是所剩頂點上的整數值。
問題:對於給定的多邊形,計算最高得分。
如下圖:
設所給的多邊形的頂點和邊的順時針序列位
op[1], v[1], op[2], v[2]...,op[n], v[n],其中op代表儲存操作符的第i條邊,v為儲存頂點數值的陣列。
設p[i][j]為儲存以i節點為起點,長度為j的鏈的運算結果最小值陣列,則可知p[i][n]為多邊形第i邊斷裂後形成的鏈的最高分值結果。假設在op[i+s]處發生了合併運算,則可以在op[i+s]處將鏈分割成兩個子鏈p[i][s],和p[i+s][j-s]兩條子鏈,這也是鏈結果運算的最優子結構。
對於操作符,當op[i+s]為+時,最高得分為兩子鏈之和;當op[i+s]為*時,因為節點的賦值可以為整數,則我們要知道左右子鏈的最大最小值,分別相乘結果取到最大。
綜上,多邊形遊戲問題滿足最優子結構性質,是動態規劃問題。
#include#include#define maax 1000
#define miin -1000
using namespace std;
int p;
int dot[maax];//多邊形頂點的數值 陣列
char op[maax];//多邊形邊的操作符號陣列
int m[maax][maax][2];//第i個頂點/長度為j時/1最大0最小值 的 儲存
void minmax(int i, int s, int j);
int polymax(int num);
int main()
for(int i=1; i<=num; i++) }
for(int i=1; i<=num; i++)//長度為1時,鏈為單個節點,則值為節點本身權值
ans = polymax(num);
cout<
m[i][j][0] = minf;
if(m[i][j][1]e[k])
minf = e[k];
if(maxfminf)
m[i][j][0] = minf;
if(m[i][j][1]
多邊形遊戲
07 多邊形遊戲 描述乙個多邊形,開始有n個頂點。每個頂點被賦予乙個正整數值,每條邊被賦予乙個運算子 或 所有邊依次用整數從1到n編號。現在來玩乙個遊戲,該遊戲共有n步 最後,所有邊都被刪除,只剩乙個頂點,遊戲結束。遊戲得分就是所剩頂點上的整數值。那麼這個整數值最大為多少?關於輸入 第一行為多邊形的...
多邊形遊戲
該問題用動態規劃中的最優子結構來解決,當把一條邊去除除后,再把它拉直,那麼這個問題就最後可以變成一條鏈。那麼就和以前寫的矩陣連乘問題和凸多邊形最優三角剖分相似,最後要求的是這個鏈的表示式算式結果的最大值。於是我們就可以想到可以用陣列p i j 來表示從點i開始,鏈長為j的算術表示式的最大值,用v i...
多邊形遊戲(博弈)
問題描述 多邊形遊戲是乙個雙人遊戲。遊戲在乙個有n個頂點的凸多邊形上進行,這個凸多邊形的n 3條對角線將多邊形分成n 2個三角形,三角形中的乙個被染成黑色,其餘是白色。雙方輪流進行遊戲,當輪到一方時,他必須沿著畫好的對角線,從多邊形上切下乙個三角形。切下黑色三角形的一方獲勝。輸入多組測試資料。每組測...