
题解:
- 首先,我们根据提示可以知道,这一道题用的方法肯定就是递归了。
- 那么让我们往递归的方向想,我们这样想,一条边,可以连接的是两个点或者是两个整块的运算结果,那我们对结果进行查找,找出其中最大的一个即可
- 代码:
#include<bits/stdc++.h>
using namespace std;
int f[101][101],ff[101];
int num[101],ans,aa;
char s[101];
int n;
int find1(int l,int r){
int i,k1,k2;
if(f[l][r]!=-1)return f[l][r];
else if(l==r)return num[l];
else {
for(i=0; i<(r+n-l)%n; i++){
k1=find1(l,(l+i)%n);
k2=find1((l+i+1)%n,r);
if(s[(l+i)%n]=='*')k1*=k2;
else k1+=k2;
if(f[l][r]==-1)
f[l][r]=k1;
else if(k1>f[l][r])f[l][r]=k1;
}
return f[l][r];
}
}
int find(int l){
int i,k1,k2;
for(i=1; i<n; i++){
k1=find1((l+1)%n,(l+i)%n);
k2=find1((l+i+1)%n,l);
if(s[l]=='*')k1*=k2;
else k1+=k2;
if(ff[l]==-1)ff[l]=k1;
else if(k1>ff[l]) ff[l]=k1;
}
return ff[l];
}
int main() {
int i,j;
ans=0;
scanf("%d",&n);
for(i=0; i<n; i++){
scanf("%d %c",&num[i],&s[i]);
}
for(i=0; i<n; i++)
for(j=0; j<n; j++) f[i][j]=-1;
for(i=0; i<n; i++) ff[i]=-1;
for(i=0; i<n; i++){
aa=find(i);
if(aa>ans)ans=aa;
}
printf("%d",ans);
return 0;
}