算法训练 最大的算式

时间限制: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

------------------------------------------------

思路:

dp[i][j]表示前i个数有j个乘号的最大值。

dp[i][j]=max(dp[i][j],dp[k-1][j-1]*sum(k,i)); k为前i个数中任意一个位置。

---------------------------------------------------------------

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a[]=new int[120];
        long sum[]=new long[120];     //sum[i]表示前i个数之和
        long f[][]=new long[120][120]; //dp[i][j]表示前i个数中有j个乘号时,所得最大值
        int n,K;
        sum[0]=0;
        Scanner sc=new  Scanner(System.in);
        n=sc.nextInt();
        K=sc.nextInt();
        for(int i=1;i<=n;i++){
            a[i]=sc.nextInt();
            sum[i]=sum[i-1]+a[i];
        }
        for(int i=1;i<=n;i++)
            f[i][0]=sum[i];
        for(int i=0;i<=n;i++){
             int t = Math.min(i - 1, K);
            for(int j=1;j<=t;j++){ //控制乘的数量
                for(int k=2;k<=i;k++){
                    long s=sum[i]-sum[k-1]; //后面 i-(k-1)数的和,k要<=i
                    f[i][j]=Math.max(f[k-1][j-1]*s, f[i][j]);//j表示乘积数,f[k-1][j-1] 要再乘上一个才是j个乘号,k个数
                }
            }
        }
        System.out.println(f[n][K]);

    }

}
时间: 2024-11-07 19:31:30

算法训练 最大的算式的相关文章

算法训练——最大的算式

//最大的算式 //对输入的N个数逆序排序,前K个数的积乘于剩余N-K个数的和 #include<stdio.h> #include<stdlib.h> #define MAXN 100 int comp(const void*a,const void*b)//用来做比较的函数. { return *(int*)b - *(int*)a; //降序 } int main(){ int i,N,K,sum = 0,product = 1; int a[MAXN]; scanf(&qu

蓝桥杯 算法训练 最大的算式(动态规划)

问题描述 题目很简单,给出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

算法训练 最大的算式(DP)

问题描述 题目很简单,给出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

蓝桥杯 算法训练 ALGO-116 最大的算式

算法训练 最大的算式 时间限制: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 -- 输入格式 输入文件共有二行,第一行为两个有空格隔开的

04-05组合问题_算法训练

算法训练 匪警请拨110,即使手机欠费也可拨通! 为了保障社会秩序,保护人民群众生命財产安全,警察叔叔须要与罪犯斗智斗勇,因而须要常常性地进行体力训练和智力训练. 某批警察叔叔正在进行智力训练: 1 2 3 4 5 6 7 8 9 = 110; 请看上边的算式,为了使等式成立,须要在数字间填入加号或者减号(能够不填.但不能填入其他符号).之间没有填入符号的数字组合成一个数.比如:12+34+56+7-8+9 就是一种合格的填法:123+4+5+67-89 是还有一个可能的答案. 求请你利用计算机

蓝桥杯——算法训练之乘积最大

问题描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

蓝桥杯 算法训练 ALGO-124 数字三角形

算法训练 数字三角形 时间限制:1.0s   内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ●三角形中的数字为整数0,1,-99: . (图3.1-1) 输入格式 文件中首先读到的是三角形的行数. 接下来描述整个三角形 输出格式 最大总和(整数) 样例输入 573 88 1 02 7 4 44 5 2 6 5 样例输出 3

蓝桥杯 算法训练 ALGO-125 王、后传说

算法训练 王.后传说 时间限制:1.0s   内存限制:256.0MB 问题描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地.各皇后都有自己的势力范围,但也总能找到相安无事的办法. 所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死...... 现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个).当然,皇后也不会攻击国王.

蓝桥杯 算法训练 ALGO-139 s01串

算法训练 s01串 时间限制:1.0s 内存限制:256.0MB 问题描述  s01串初始为"0"  按以下方式变换  0变1,1变01 输入格式  1个整数(0~19) 输出格式  n次变换后s01串 样例输入 3 样例输出 101 数据规模和约定  0~19 示例代码: 1 import java.util.Scanner; 2 3 public class Main { 4 static StringBuffer sb = new StringBuffer(); 5 public