java蓝桥杯的题_Java蓝桥杯试题集——算法训练ALGO-116——最大的算式

题目要求

8257bb7d43954bb84885560f867cf8f9.png

解题思路

动态规划,今天才弄明白QAQ,借鉴了这位大佬的博客,曹磊的博客 写的很好!但是我觉得我的循环方式更容易理解嘿嘿嘿~

首先建立如下图的数组,行数代表前几位数,列数代表有几个乘号。将第0列赋值为前i个数的和。(没有*号,全是+号,比如第4行就是前4个数的和)

然后从第1列开始循环,*至少要在第二个数字之前出现,所以index=2。第一列应该是所有有1个*的最大值。求的方法也很简单:

dp[2][1]就是1*2,这个2就是dp[2][0] - dp[1][0]得来的。

dp[3][1]的求解循环了2遍,当 1*(2+3),和当(1+2)*3。选取结果最大的那个。

7015934238e5897ddb5e4c0d57790428.png

当有两个*时:

1718829823a18c39235fd37f49a91336.png

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner in = new Scanner(System.in);

int n = in.nextInt();

int k = in.nextInt();

long[][] dp = new long[n + 1][k + 1]; // 第0行不用,这里使用long

int i, j, index;

for (i = 1; i <= n; i++) {

dp[i][0] = dp[i - 1][0] + in.nextInt(); // 初始化第0列数组,是没有乘号的情况下的最大值(和)

}

for (j = 1; j <= k; j++) { // 列数

for (i = j + 1; i <= n; i++) { // 行数

for (index = 2; index <= i; index++) { // 第几个值前面有*

dp[i][j] = Math.max(dp[i][j], dp[index - 1][j - 1] * (dp[i][0] - dp[index - 1][0]));

}

}

}

System.out.println(dp[n][k]);

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值