多邊形遊戲

2021-10-03 02:53:25 字數 1666 閱讀 4542

07 多邊形遊戲

描述乙個多邊形,開始有n個頂點。每個頂點被賦予乙個正整數值,每條邊被賦予乙個運算子「+」或「*」。所有邊依次用整數從1到n編號。現在來玩乙個遊戲,該遊戲共有n步:

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

關於輸入

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

關於輸出

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

例子輸入

4

4 *5 +

5 +3 +

例子輸出
70
分析

​ 首先,這顯然要分成兩步來完成。在主函式中我們刪除一條邊,把乙個環拆開變成一條線,然後再用遞迴函式來完成對剩下的這個「線」的求值。這裡稍微有點麻煩的地方在於這個線是物理上不連續的,涉及乙個取模的運算,要仔細考慮。

​ 我們用乙個函式f(begin,end)來表徵從beginend的這一條邏輯上的線段的值。遞迴出口是這兩者相等,返回對應的節點的值。而遞推關係則比較奇妙:

f (b

egin

,end

)=ma

x(f(

begi

n,de

vide

)opf

(dev

ide+

1,en

d)

f(begin,end)=max(f(begin,devide) \text op \text f (devide+1,end)

f(begi

n,en

d)=m

ax(f

(beg

in,d

evid

e)op

f(de

vide

+1,e

nd)op為對應線段的操作,devide為乙個迴圈變數。並且值得注意的是,這個迴圈的出口和遞增的條件,由於取模的需要,都比較特殊,詳見**

這裡事實上用的是記憶化搜尋…如果n≤15

n\leq 15

n≤15

,可以直接遞迴

**實現

#include

using

namespace std;

int n, nums[55]

=;char edges[55]

=;int result[55]

[55]=

;int

main()

cout << max;

}intf(

int begin,

int end)

int max =0;

for(

int split = begin; split != end; split =

(split +1)

% n)

//特別之處

result[begin]

[end]

= max;

return max;

}

多邊形遊戲

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

多邊形遊戲問題

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

多邊形遊戲(博弈)

問題描述 多邊形遊戲是乙個雙人遊戲。遊戲在乙個有n個頂點的凸多邊形上進行,這個凸多邊形的n 3條對角線將多邊形分成n 2個三角形,三角形中的乙個被染成黑色,其餘是白色。雙方輪流進行遊戲,當輪到一方時,他必須沿著畫好的對角線,從多邊形上切下乙個三角形。切下黑色三角形的一方獲勝。輸入多組測試資料。每組測...