动态规划 表达式最大值

package com.bluecup.org;

import java.util.Scanner;

public class MaxValue {

	/**
	 * @param args
	 */
	static int f[][][] = new int[20][20][2];
	static int a[] = new int[20];
	static char c[] = new char[20];

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// String str="123456";
		// String str1="+*+++";
		Scanner scan = new Scanner(System.in);
		String str = scan.next();
		init(str);
		for (int i = 2; i <= n; i++) {
			for (int j = 0; n >= j + i; j++)
				for (int k = 1; k < i; k++) {
					if (i == 2) {
						if (c[j + k - 1] == '+'){
							f[j][j + 1][0] = f[j][j + 1][1] = a[j] + a[j + 1];
						}
						else
						{
							f[j][j + 1][0] = f[j][j + 1][1] = a[j] * a[j + 1];
						}
					} else {
						if (c[j + k - 1] == '+') {
							int r1 = f[j][j + k - 1][0]
									+ f[j + k][j + i - 1][0];
							int r2 = f[j][j + k - 1][1]
									+ f[j + k][j + i - 1][0];
							int r3 = f[j][j + k - 1][0]
									+ f[j + k][j + i - 1][1];
							int r4 = f[j][j + k - 1][1]
									+ f[j + k][j + i - 1][1];
							f[j][j + i - 1][0] = Math.max(Math.max(r1, r2),
									Math.max(r3, r4));
							f[i][j + i][1] = Math.min(Math.min(r1, r2),
									Math.min(r3, r4));
						} else {
							int r1 = f[j][j + k - 1][0]
									* f[j + k][j + i - 1][0];
							int r2 = f[j][j + k - 1][1]
									* f[j + k][j + i - 1][0];
							int r3 = f[j][j + k - 1][0]
									* f[j + k][j + i - 1][1];
							int r4 = f[j][j + k - 1][1]
									* f[j + k][j + i - 1][1];
							f[j][j + i - 1][0] = Math.max(Math.max(r1, r2),
									Math.max(r3, r4));
							f[i][j + i][1] = Math.min(Math.min(r1, r2),
									Math.min(r3, r4));
						}
					}
				}
		}
		System.out.println(f[0][n-1][0]);
	}

	static int n;

	private static void init(String str) {
		// TODO Auto-generated method stub
		int i = 0;
		int num = 0;
		while (i < str.length()) {

			if (str.charAt(i) == '*' || str.charAt(i) == '+') {
				c[n] = str.charAt(i);
				a[n] = num;
				f[n][n][0]=num;
				f[n][n++][1]=num;
				num = 0;
			} else {
				if(str.charAt(i)>='0'&&str.charAt(i)<='9')
				num = num * 10 + Integer.parseInt(str.charAt(i) + "");
			}
			i++;
		}
		a[n] = num;
		f[n][n][0]=num;
		f[n][n++][1]=num;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值