标签:
问题描述:
给定一个多边形,多边形的每一个顶点上有一个数字,每一条边上有一个运算符(+或*),现在你可以去掉多边形的任意一条边,这样多边形顶点上的数字和边上的符号就购成了一个表达式,对表达式进选择不同的计算顺序,便得到不同的结果,现在给定多边形顶点上的数字和边上的符号,找出能得到的最大值。
如图:我们可以断开第一个“+”号,得到表达式10*2+3*5,对于这个表达式可以这样算(10*2+3)*5=115;也可以这样算10*2+3*5=35;现在的问题是找一种断开法,和一种算法使得算出的值最大。
输入:
10
10 -3 1 2 2 8 4 10 6 5
+ + + + * + + + + +
输出:
506
1 #include <algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<iomanip> 5 #include <cstdio> 6 #include <vector> 7 #include <cmath> 8 using namespace std; 9 10 bool you; 11 int n;long long sum[205];long long f[105][105][2];//表示以x开头长度为y时的最大值及最小值 12 char fu[205]; 13 14 int main(){ 15 scanf("%d",&n);long long maxe; 16 for(int x=1;x<=n;x++){cin>>sum[x];sum[x+n]=sum[n];} 17 for(int x=1;x<=n;x++){scanf("%s",fu+x);} 18 for(int x=1;x<=n;x++)f[x][0][0]=sum[x],f[x][0][1]=sum[x]; 19 for(int y=1;y<n;y++){ 20 for(int x=1;x<=n;x++){ 21 bool use1=0,use2=0; 22 for(int z=0;z<y;z++){ 23 int r=x+z+1; 24 if(x+z+1>n)r=r%n; 25 long long int a=f[x][z][0],b=f[r][y-z-1][0],c=f[x][z][1],d=f[r][y-z-1][1]; 26 long long int e,i,g,h; 27 int j=x+z; 28 if(x+z>n)j=(x+z)%n; 29 if(fu[j]==‘+‘)e=a+b,i=c+b,g=a+d,h=c+d; 30 else e=a*b,i=c*b,g=a*d,h=c*d; 31 long long int minn=min(min(e,i),min(g,h)); 32 long long int maxn=max(max(e,i),max(g,h)); 33 if(use1==0)use1=1,f[x][y][0]=minn; 34 else f[x][y][0]=min(f[x][y][0], minn); 35 if(use2==0)f[x][y][1]=maxn,use2=1; 36 else f[x][y][1]=max(f[x][y][1],maxn); 37 } 38 use1=0,use2=0; 39 if(y==n-1){if(you==0)you=1,maxe=f[x][y][1];else maxe=max(maxe,f[x][y][1]);} 40 } 41 } 42 cout<<maxe; 43 // 4 10 2 3 5 * + * + 44 45 return 0; 46 }
标签:
原文地址:http://www.cnblogs.com/Ateisti/p/5778615.html