算法設計作業 多邊形遊戲 動態規劃

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

依次編號爲1~N。下圖給出了一個N=4個頂點的多邊形。

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

思路:

環狀的用兩倍的數組儲存,刪掉一條邊後轉換成去給一個式子加括號,怎麼加使值最大。

狀態轉移方程:dp[i][j]=max(dp[i][j],d(i,k)$d(k+1,j));

$表示與k+1之間的運算符,i<=k<j.

 樣例輸入:5 3*5+6+-7*3+

樣例輸出:78

代碼:

#include<bits/stdc++.h>
#define INF -9999999
using namespace std;
const int maxn = 100;
int num[maxn];
char s[maxn];
int dp[maxn][maxn];
int d(int i,int j){
	if(dp[i][j]!=INF) return dp[i][j];
	if(i==j) return dp[i][j]=num[i];
	
	for(int k=i;k<j;k++){
		if(s[k]=='*')
			dp[i][j]=max(dp[i][j],d(i,k)*d(k+1,j));
		else
			dp[i][j]=max(dp[i][j],d(i,k)+d(k+1,j));
	}
	return dp[i][j];
}
int main()
{
	int n;
	while(cin>>n&&n){
		for(int i=0;i<n;i++){
			cin>>num[i];
			num[i+n]=num[i];
			cin>>s[i];
			s[i+n]=s[i];
		}
		int ans=INF;
		fill(dp[0],dp[0]+maxn*maxn,INF);
		for(int i=0;i<n;i++){
			ans=max(ans,d(i+1,i+n)); 
		}
		cout<<ans<<endl;
	}
	return 0;
 } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章