算法设计作业 多边形游戏 动态规划

给定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;
 } 

 

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