算法训练 最大的算式  
时间限制:1.0s   内存限制:256.0MB
问题描述
  题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。例如:
  N=5,K=2,5个数字分别为1、2、3、4、5,可以加成:
  1*2*(3+4+5)=24
  1*(2+3)*(4+5)=45
  (1*2+3)*(4+5)=45
  ……
输入格式
  输入文件共有二行,第一行为两个有空格隔开的整数,表示N和K,其中(2<=N<=15, 0<=K<=N-1)。第二行为 N个用空格隔开的数字(每个数字在0到9之间)。
输出格式
  输出文件仅一行包含一个整数,表示要求的最大的结果
样例输入
5 2
1 2 3 4 5
样例输出
120
样例说明
  (1+2+3)*4*5=120
 

题目解析:

  本题涉及到一种算法——动态规划。

  (1)动态规划思想

  在分治求解过程中,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出,就可以避免大量重复问题的计算,从而得到多项式时间算法。
  (2)设计动态规划的步骤 
      ① 找出最优解的性质,并刻画其结构特征;
      ② 递归地定义最优值(写出动态规划方程);
      ③ 以自底向上的方式计算出最优值(填入表格);
      ④ 根据计算最优值时得到的信息,构造一个最优解。
    说明:  a.步骤 ① ~ ③ 是动态规划算法的基本步骤;
         b.在只需要求出最优值的情况,步骤 ④ 可以省略;若需要求出一个最优解,则必须要有第 ④ 步。
  (3)动态规划的特征
    ① 最优子结构
        当问题的最优解包含了其子问题的最优解,称该问题具有最优子结构性质。
    ② 重叠子问题
        在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重要性质,对每一个子问题只求        解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题。
 
  以题目给出的样例输入为例,分析动态规划算法:
  (1)利用 sum 数组将前 i 个数之和保存。
    
  (2)利用 dp 数组来保存前 i 个数有 0 个乘号时的最大值(全加时的值,与 sum 数组相同),即 dp[i][0];
    
  (3)在动态规划算法中,从第二( i 从 2 开始)个数后开始加乘号,前 i 个数循环累加 i - 1 (j 从 1 开始,到 i -1 结束,且不能大于 k)个乘号,乘号位置循环从第一个数后的位置到第 i 个数前的位置(p 从 2 开始, 到 i 结束);
   step 1:  i = 2    j = 1    p = 2     说明:前两个数,有一个乘号,位置在第二个数前面
        dp[2][1] = 0                说明:前两个数一个乘号时,值为 0 (表1.2中 dp[2][1])
        dp[1][0] x ( sum[2] - sum[1] ) = 2  说明:前一个数没有乘号乘上前两个数之和减去前一个数之和,即前一个数乘第二个数(1*2 = 2)
        dp[2][1] = max( 0 , 2 )         说明:填入 dp 表中
        
   step 2:  i = 3    j = 1    p = 2     说明:前三个数,有一个乘号,位置在第二个数前面
        dp[3][1] = 0                说明:前三个数一个乘号时,值为 0 (表1.2中 dp[3][1])
        dp[1][0] x ( sum[3] - sum[1] ) = 2  说明:前一个数没有乘号乘上前三个数之和减去前一个数之和,即前一个数乘前两个数之和(1*(2+3) = 5)
        dp[3][1] = max( 0 , 5 )         说明:填入 dp 表中
         
 
   step 3:  i = 3    j = 1    p = 3     说明:前三个数,有一个乘号,位置在第三个数前面
        dp[3][1] = 5                说明:前三个数一个乘号时,值为 0 (表1.2中 dp[3][1])
        dp[2][0] x ( sum[3] - sum[2] ) = 9  说明:前两个数没有乘号乘上前三个数之和减去前两个数之和,即前一个数乘第三个数之和((1+2)* 3) = 9)
        dp[3][1] = max( 5 , 9 )         说明:填入 dp 表中
        
   . . . . . .
   只到所有的循环执行结束,一共 19 步。dp 表最终结果为:
        
   当 5 个数有 2 个乘号时,最大值应为 dp[5][2] = 120。在循环执行过程中,我们不用担心 dp[p-1][j-1] * (sum[i] - sum[p-1]) 究竟是那几个数得到的结果,而使用它的值就可以啦,这就是动态规划最重要的特性之一!
 
示例代码:
 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int k = Integer.parseInt(str[1]); long[][] dp = new long[n+1][k+1]; //dp[i][j]表示前i个数中有j个乘号时,所得最大值
int[] sum = new int[n+1]; //前i个数之和 str = br.readLine().split(" ");
for(int i = 1; i <= n; i++) {
sum[i] = sum[i-1] + Integer.parseInt(str[i-1]);
} //没有乘号的情况,即连加的情况
for(int i = 1; i <= n; i++) {
dp[i][0] = sum[i];
}
//动态规划
for(int i = 2; i <= n; i++) { //前i个数
for(int j = 1; j <= i-1 && j <= k; j++) { //乘号的个数
for(int p = 2; p <= i; p++) { //乘号的位置
dp[i][j] = max(dp[i][j], dp[p-1][j-1] * (sum[i] - sum[p-1]));//求前i个数有j个乘号时的最大值
}
}
} System.out.println(dp[n][k]);
} /**
* 求最大数
* @param a 参数1
* @param b 参数2
* @return a b中的最大数
*/
private static long max(long a, long b) {
return a>b?a:b;
}
}

蓝桥杯 算法训练 ALGO-116 最大的算式的更多相关文章

  1. Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)

    试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...

  2. Java实现蓝桥杯 算法训练 大等于n的最小完全平方数

    试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...

  3. 蓝桥杯算法训练 java算法 表达式求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...

  4. java实现 蓝桥杯 算法训练 Password Suspects

    问题描述 在年轻的时候,我们故事中的英雄--国王 Copa--他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好记又难以破解.后来,他才知道这种密码是一个长度为奇数 ...

  5. 蓝桥杯 算法训练 Torry的困惑(基本型)(水题,筛法求素数)

    算法训练 Torry的困惑(基本型) 时间限制:1.0s   内存限制:512.0MB      问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7……这样的数叫做质数.Torry突 ...

  6. 蓝桥杯 算法训练 区间k大数查询(水题)

    算法训练 区间k大数查询 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. ...

  7. 蓝桥杯--算法训练 区间k大数查询

                                                                                 算法训练 区间k大数查询   时间限制:1.0 ...

  8. 蓝桥杯算法训练 区间k大数查询

    算法训练 区间k大数查询   问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个 ...

  9. 蓝桥杯 算法训练 ALGO-15 旅行家的预算

    算法训练 旅行家的预算   时间限制:1.0s   内存限制:256.0MB 问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车 ...

随机推荐

  1. mysql主从搭建之诡异事件

    今天在搭建主从后出现了主库system账号丢失INSERT权限的情况,记录如下 主库: system账号权限同root权限,并且mysql库已经删除 从库: mysql库存在,无system账号 主从 ...

  2. 快速切题 acdream手速赛(6)A-C

    Sudoku Checker Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Submi ...

  3. Integer封装类的相关知识

    java中,在一些情况下会有自动装箱与自动拆箱. 自动拆箱/装箱是在编译期,依据代码的语法,决定是否进行拆箱和装箱动作.装箱过程:把基本类型用它们对应的包装类型进行包装,使基本类型具有对象特征.拆箱过 ...

  4. MyEclipse WebSphere开发教程:WebSphere 8安装指南(一)

    [周年庆]MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] IBM为使用WebSphere测试应用程序的开发人员提供了免费的WebSphere Ap ...

  5. windows下清除svn密码

    刚进公司的时候没有SVN账号,暂用别人的账号很平常,为了更好的代码管理,后面肯定用自己的账号. 那么怎么清除呢. 进入 C:\Documents and Settings\Administrator\ ...

  6. iOS plist文件的读写

    原帖:http://blog.csdn.net/totogo2010/article/details/7634185 在做iOS开发时,经常用到到plist文件,  那plist文件是什么呢? 它全名 ...

  7. tp5中捕获异常的配置

    首选在配置文件中加入配置如下 // 异常处理handle类 留空使用 \think\exception\Handle    'exception_handle'       => '\\app\ ...

  8. UIApplication的详细介绍

    UIApplication 什么是UIApplication? UIApplication对象是应⽤程序的象征.每一个应用都有⾃己的UIApplication对象,这个对象是系统自动帮我们创建的, 它 ...

  9. 一年内自学MIT的33门课? 疯狂学习有方法

    [导读]能快速掌握复杂信息,对成就卓越事业至关重要.ScottYoung的学习过程不只适用于学生,同样有助于学习复杂技能的专业知识. 能快速掌握复杂信息,对成就卓越事业至关重要.ScottYoung的 ...

  10. windows7所有版本迅雷地址下载集合(含32位和64位) - imsoft.cnblogs

    Windows7 SP1旗舰版 32位官方原版下载: ed2k://|file|/cn_windows_7_ultimate_with_sp1_x86_dvd_618763.iso|265187737 ...