07 多邊形遊戲
描述乙個多邊形,開始有n個頂點。每個頂點被賦予乙個正整數值,每條邊被賦予乙個運算子「+」或「*」。所有邊依次用整數從1到n編號。現在來玩乙個遊戲,該遊戲共有n步:
最後,所有邊都被刪除,只剩乙個頂點,遊戲結束。遊戲得分就是所剩頂點上的整數值。那麼這個整數值最大為多少?
關於輸入
第一行為多邊形的頂點數n(n≤15),其後有n行,每行為乙個整數和乙個字元,整數為頂點上的正整數值,字元為該頂點到下乙個頂點間連邊上的運算子「+」或「*」(最後乙個字元為最後乙個頂點到第乙個頂點間連邊上的運算子)。
關於輸出
輸出僅乙個整數,即遊戲所計算出的最大值。
例子輸入
4
4 *5 +
5 +3 +
例子輸出70
分析
首先,這顯然要分成兩步來完成。在主函式中我們刪除一條邊,把乙個環拆開變成一條線,然後再用遞迴函式來完成對剩下的這個「線」的求值。這裡稍微有點麻煩的地方在於這個線是物理上不連續的,涉及乙個取模的運算,要仔細考慮。
我們用乙個函式f(begin,end)
來表徵從begin
到end
的這一條邏輯上的線段的值。遞迴出口是這兩者相等,返回對應的節點的值。而遞推關係則比較奇妙:
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個三角形,三角形中的乙個被染成黑色,其餘是白色。雙方輪流進行遊戲,當輪到一方時,他必須沿著畫好的對角線,從多邊形上切下乙個三角形。切下黑色三角形的一方獲勝。輸入多組測試資料。每組測...