1. 程式人生 > >演算法-藍橋杯-演算法訓練 最大的算式 (JAVA)

演算法-藍橋杯-演算法訓練 最大的算式 (JAVA)

1 引言

    今天的第一篇文章,競賽開始進入倒計時了!

2 題目

問題描述

  題目很簡單,給出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

3 原始碼

import java.util.Scanner;

public class Main {
    static int N;
    static int Mul;
    static long[] num = new long[20];
    static long[] sum = new long[20];
    static long[][] dp = new long[20][20];
    /*
     * dp[i][j]代表前i個數中有j個乘號的最大值
     * sum[i]是前i個數的和
     * 狀態轉移方程:dp[i][0] = sum[i]
     * dp[i][j] = max(dp[i][j],dp[k-1][j-1]*(sum[i]-sum[j-1]))
     * k為乘號的位置;
     */

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        N= in.nextInt();
        Mul = in.nextInt();
        for ( int i = 0 ; i < 20 ; i++){
            for ( int j = 0 ; j < 20 ; j++){
                dp[i][j] = 0;
            }
        }
        sum[0] = 0;
        num[0] = 0; 
        for ( int i = 1 ; i <= N ; i++){
            num[i] = in.nextLong();
            sum[i] = sum[i-1] + num[i];
            dp[i][0] = sum[i];
        }
        for ( int i = 2 ; i <= N ; i++){
            int t = Math.min(i, Mul);
            for ( int j = 1 ; j <= t ; j++){//j為乘號的個數
                for ( int k = 2 ; k <= i ; k++){//k為乘號的位置
                    long tmp = sum[i]-sum[k-1];
                    dp[i][j] = Math.max(dp[i][j], dp[k-1][j-1]*tmp);
                }
            }
        }
        System.out.print(dp[N][Mul]);
        in.close();
    }

}

4 思路講解

    參考別人的。。。。

5 結束語

    分享和幫助是人生一大樂事,希望可以幫助您。本人才疏學淺,如果有不當之處,還請批評指正。同時歡迎大家評論、點贊及轉發!

相關推薦

演算法——藍橋篇——乘積

問題描述   今年是國際數學聯盟確定的“2000——世界數學年”,又恰逢我國著名數學家華羅庚先生誕辰90週年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的一個好朋友XZ也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目:   

演算法 - 求子陣列的C++

  //**************************************************************************************************** // // 求子陣列的最大和 - C++ - by Chimomo // //

筆試面試演算法經典--連續子陣列的乘積及連續子陣列的Java

1. 子陣列的最大和 輸入一個整形陣列,數組裡有正數也有負數。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。求所有子陣列的和的最大值。例如陣列:arr[]={1, 2, 3, -2, 4, -3 } 最大子陣列為 {1, 2, 3, -2,

藍橋 基礎訓練 完美的代價

  基礎練習 完美的代價   時間限制:1.0s   記憶體限制:512.0MB 問題描述   迴文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為迴文串才是完美的。現在給你一個串,它不一定是迴文的,請你計算最少的交換次數使得該串變成

《劍指offer》系列 連續子陣列的Java

連結 牛客:連續子陣列的最大和 題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊

藍橋:蒜頭君的隨機數java

package lanqiaobei; import java.util.*; /* 練習題:蒜頭君的隨機數 蒜頭君想在學校中請一些同學一起做一項問卷調查,為了確保實驗的客觀性,他先用計算機生成了 n(1≤n≤100)個 1 到 1000 之間的隨機整數,對於其中重複的數字,只保留一個,把其餘相

藍橋:進位制轉換java

package lanqiaobei; import java.util.HashMap; import java.util.Scanner; import java.util.Stack; /* 練習題:進位制轉換 輸入一個十進位制數 N,將它轉換成 R 進位制數輸出。在 10≤R≤16的情況

《劍指offer》系列 連續子陣列的Java

連結 題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如

LeetCode: 104. 二叉樹的深度Java

題目 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 返回它的最大深度 3 。 解答:感覺現在會做了。遞迴

藍橋真題 ——地宮取寶java

 標題:地宮取寶     X 國王有一個地宮寶庫。是 n x m 個格子的矩陣。每個格子放一件寶貝。每個寶貝貼著價值標籤。     地宮的入口在左上角,出口在右下角。    

劍指offer第二版面試題42:連續子陣列的java

題目描述: 輸入一個整型陣列,數組裡有正數也有負數。陣列中一個或連續的多個整陣列成一個子陣列。求所有子陣列的和的最大值。要求時間複雜度為O(n)。例如輸入的陣列為{1,-2,3,10,-4,7,2,-5},和最大的子陣列為{3,10,-4,7,2},因此輸出為

二叉樹中節點的距離java

定義二叉樹中節點的距離為節點之間邊的個數。<p> <wbr>  <wbr> 一個二叉樹中節點的最大距離由三部分綜合求得:一部分是左子樹中節點的最大距離,另一部分是右子樹中節點的最大距離,最後一部分是左邊的最大深度加上右邊的最大深度。<

二叉樹深度Java

題目:輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉子結點一次經過的結點形成樹的一條路徑,最長路徑的長度為樹的深度。根節點的深度為1。 解體思路: 如果根節點為空,則深度為0,返回0,遞迴的出口 如果根節點不為空,那麼深度至少為1,然後我們求他們左右子樹的深度, 比較左

演算法-藍橋-演算法訓練 算式 JAVA

1 引言    今天的第一篇文章,競賽開始進入倒計時了!2 題目問題描述  題目很簡單,給出N個數字,不改變它們的相對位置,在中間加入K個乘號和N-K-1個加號,(括號隨便加)使最終結果儘量大。因為乘號和加號一共就是N-1個了,所以恰好每兩個相鄰數字之間都有一個符號。例如: 

演算法-藍橋-演算法訓練 Torry的困惑(基本型) JAVA

1 引言    Torry的困惑,我們程式設計來解決,我們的困惑,還是要我們自己來解決。。。2 題目問題描述  Torry從小喜愛數學。一天,老師告訴他,像2、3、5、7……這樣的數叫做質數。Torry突然想到一個問題,前10、100、1000、10000……個質數的乘積是多

演算法-藍橋-演算法訓練 Lift and Throw C++

1 引言    吃完飯,繼續,今天的目標是10篇,然後去看《演算法》和課外書。2 題目問題描述  給定一條標有整點(1, 2, 3, ...)的射線. 定義兩個點之間的距離為其下標之差的絕對值.  Laharl, Etna, Flonne一開始在這條射線上不同的三個點, 他們

演算法-藍橋-演算法訓練 表示式計算 JAVA

1 引言什麼題。。。2 題目問題描述  輸入一個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式  輸入一行,包含一個表示式。輸出格式  輸出這個表示式的值。樣例輸入1-2+3*(4-5)樣例輸出-4資料規模和約定  表示式長度不超過100,表示式運算

演算法-藍橋-入門訓練 Fibonacci數列 JAVA

1 引言    斐波那契數列一直以來都是一個經典的問題,可惜的是以前“只聞其聲不見其人”,沒有好好地研究這個問題,這次恰好在藍橋杯的入門訓練中遇到,實乃萬幸。2 題目問題描述Fibonacci數列的遞推

2018.11.14——期望EM演算法

最大期望演算法(expectation-maximization ),依賴於不可觀察的隱形變數(例如神經網路中的權值)的概率模型中——引數的最大似然估計。 似然:來源於古漢語,“然” 稱之為xxxxx的樣子,似然 = 像應該有的樣子。引數該有的樣子,怎麼得到?答:一系列引數,使得期望最大,例如對

ALGO-70演算法訓練 長字串 c++

演算法訓練 最長字串   時間限制:1.0s   記憶體限制:512.0MB        求出5個字串中最長的字串。每個字串長度在100以內,且全為小寫字母。 樣例輸入 one two three four fiv