#include <ctime>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int mini,maxi;
int n;
int m[100][100][2]; //m[i][j][] i表示起点,j表示长度。
char op[100];
int v[100];
void myminmax(int i,int s,int j)
{
int e[5];
int a=m[i][s][0];
int b=m[i][s][1];
int r=(i+s-1)%n+1;
int c=m[r][j-s][0];
int d=m[r][j-s][1];
if(op[r]=='+')
{
mini=a+c;
maxi=b+d;
}
else
{
e[1]=a*c;
e[2]=a*d;
e[3]=b*c;
e[4]=b*d;
mini=e[1];
maxi=e[1];
for(int k=2;k<5;k++)
{
if(mini>e[k])
mini=e[k];
if(maxi<e[k])
maxi=e[k];
}
}
}
void ploymax()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
m[i][j][0]=INT_MAX;
m[i][j][1]=INT_MIN;
}
for(int i=1;i<=n;i++) //初始化数组
{
m[i][1][0]=v[i];
m[i][1][1]=v[i];
}
for(int j=2;j<=n;j++) //本次分割个点中一共有几个点
for(int i=1;i<=n;i++) //起点,同时也说明了删除第i条边
for(int s=1;s<j;s++) //在op(i+s)处分割两子链,op表示边。
{
myminmax(i,s,j);
if(m[i][j][0]>mini) m[i][j][0]=mini;
if(m[i][j][1]<maxi) m[i][j][1]=maxi;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf(" %c%d",&op[i],&v[i]);
ploymax();
int t1=m[1][n][1];
int t2=1;
for(int i=2;i<=n;i++)
if(t1<m[i][n][1])
{
t1=m[i][n][1];
t2=i;
}
cout<<t1<<" "<<t2<<endl;
return 0;
}
/*
4
+ -7 + 4 * 2 * 5
*/
多边形问题
最新推荐文章于 2019-11-08 13:47:51 发布