動態規劃 多邊形遊戲

2022-08-16 23:18:17 字數 1832 閱讀 2364

1、問題描述:

給定n個頂點的多邊形,每個頂點標有乙個整數,每條邊上標有+(加)或是×(乘)號,並且n條邊按照順時針

依次編號為1~n。下圖給出了乙個n=4個頂點的多邊形。

遊戲規則 :(1) 首先,移走一條邊。 (2) 然後進行下面的操作: 選中一條邊e,該邊有兩個相鄰的頂點,不妨稱為v1和v2。對v1和v2頂點所標的整數按照e上所標運算符號(+或是×)進行運算,得到乙個整數;用該整數標註乙個新頂點,該頂點代替v1和v2 。 持續進行此操作,直到最後沒有邊存在,即只剩下乙個頂點。該頂點的整數稱為此次遊戲的得分(score)。

2、問題分析:

解決該問題可用動態規劃中的最優子結構性質來解。該問題與凸多邊形最優三角剖分問題類似, 但二者的最優子結構性質不同。 多邊形遊戲的最優子結構性質更具有一般性。

設所給的多邊形的頂點和邊的順時針序列為op[1],v[1],op[2],v[2],op[3],…,op[n],v[n] 其中,op[i]表示第i條邊所對應的運算子,v[i]表示第i個頂點上的數值,i=1~n。

在所給的多邊形中,從頂點i(1<=i<=n)開始,長度為j(鏈中有j個頂點)的順時針鏈p(i,j)可表示為v[i],op[i+1],…,v[i+j-1],如果這條鏈的最後一次合併運算在op[i+s]處發生(1<=s<=j-1),則可在op[i+s]處將鏈分割為兩個子鏈p(i,s)和p(i+s,j-s)。

設m[i,j,0]是鏈p(i,j)合併的最小值,而m[i,j,1]是最大值。若最優合併在op[i+s]處將p(i,j)分為兩個長度小於j的子鏈的最大值和最小值均已計算出。即:

a=m[i,s,0]  b=m[i,s,1]  c=m[i,s,0]  d=m[i,s,1]

(1) 當op[i+s]=』+』時

m[i,j,0]=a+c ;m[i,j,1]=b+d

(2) 當op[i+s]=』*』時

m[i,j,0]=min ; m[i,j,1]=max

由於最優斷開位置s有1<=s<=j-1的j-1中情況。 初始邊界值為 m[i,1,0]=v[i]   1<=i<=n m[i,1,1]=v[i]   1<=i<=n

因為多變形式封閉的,在上面的計算中,當i+s>n時,頂點i+s實際編號為(i+s)modn。按上述遞推式計算出的m[i,n,1]記為遊戲首次刪除第i條邊後得到的最大得分。

摘自:演算法描述:

1

void minmax(int i, int s, inti)2

14else

1527}28

}2930int

polymax()

3140

int temp = m[1][n][1

];41

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

42//

這裡的m[i][n][1]表示遊戲刪去第i條邊後

43//

得到的最大得分。

44if(temp1]) temp = m[i][n][1

]; 45

return

temp;46}

47//

48//

當i+s>n時, 頂點i+s實際編號為(i+s)mod n .

49//

按以上的遞推公式計算出的m[i][n][1]表示

50//

遊戲刪去第i條邊後得到的最大得分。

view code

動態規劃 多邊形遊戲

已知乙個n邊的多邊形,在n個頂點上都有乙個整數,在n條邊上都存在 或 號。遊戲開始時,撤掉一條邊。剩下的就會變成由n個頂點,n 1條邊所組成的鏈條。將其中兩個相鄰的頂點按之間的運算子進行運算,這兩個頂點和這條邊被替換為運算結果,鏈條被削減為n 1個頂點,n 2條邊。如此反覆直到最後只剩下乙個點。多邊...

多邊形遊戲(區間動態規劃)

就是乙個區間動態規劃,為了處理環狀結構,乙個好的想法是把整個頂點和邊的序列在後面再複製一遍。可以比較簡化 實現的複雜度。include using namespace std const int maxn 105 struct calseq bool operator const calseq l ...

動態規劃(DP)之多邊形遊戲問題

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