多边形游戏

import java.util.Scanner;


public class Main {

 /**
  * @param args
  */
 
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  PolygonGame polygon = new PolygonGame();
  System.out.println(polygon.polyMax());
  
 }
}
class PolygonGame
{
 static int n;         //顶点个数   
    static String[] op;  //操作符数组   
    static int[] v;      //顶点代表的数   
    static int minf, maxf; //在某处断开的最小,最大值   
    static int m[][][]; //链p[i][j]合并的最大最小值
 public PolygonGame()
 {
  Scanner in = new Scanner(System.in);    
        n = in.nextInt();  //输入顶点个数 
        in.nextLine();   
        String str = in.nextLine(); //顶点代表的数和操作符输入  
        String[] s = str.split(" ");//空格分开的字符串数组   
        op = new String[n+1];   //分配空间
        v = new int[n+1];   
        for(int i=0, k=n, j=n; i<s.length; i++) {   
            if(i%2==0) {   
                v[k] = Integer.parseInt(s[i]);  //顶点代表的数 
                k--;   
            } else {   
                op[j] = s[i];    //操作符
                j--;   
            }   
        }   
  m = new int[n+1][n+1][2];
  for(int i = 1;i<=n;i++)
  {//初始边界
   m[i][1][0] = v[i];
   m[i][1][1] = v[i];
  }
 }
 private static void minMax(int i,int s,int j)
 {
  int []e = new int[5];
  int a = m[i][s][0],   //某段的最小最大值
   b = m[i][s][1],
   r = (i+s-1)%n+1,
   c = m[r][j-s][0],
   d = m[r][j-s][1];
  if(op[r].equals("+"))
  {
   minf = a+c;//最小值为两段最小值之和
   maxf = b+d;//最大值为两段最大值之和
  }
  else
  {
   e[1] = a*c;
   e[2] = a*d;
   e[3] = b*c;
   e[4] = b*d;
   minf = e[1];
   maxf = e[1];
   for(int k = 2;k<5;k++)
   {
    if(minf >e[k])
     minf = e[k];
    if(maxf < e[k])
     maxf = e[k];
   }
  }
 }
 public static int polyMax()
 {
  for(int j = 2;j<=n;j++)
   for(int i = 1;i<=n;i++)
    for(int s = 1;s<j;s++)
    {
     minMax(i,s,j);
     if(m[i][j][0] > minf)
      m[i][j][0] = minf;
     if(m[i][j][1] < maxf)
      m[i][j][1] = maxf;
    }
  int temp = m[1][n][1];
  for(int i= 2;i<=n;i++)
   if(temp < m[i][n][1])
    temp = m[i][n][1];
  return temp;
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值