藍橋杯 ALGO 116演算法訓練 最大的算式

2021-07-15 10:17:25 字數 1017 閱讀 6095

問題描述

題目很簡單,給出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 21 2 3 4 5

樣例輸出

120樣例說明

(1+2+3)*4*5=120

分析:用動態規劃解決~設sum[i]為前i個數的總和,那麼從j到k的總和為sum[k]-sum[j-1]。設dp[i][j]表示前i個數中有j個乘號的最大的結果。則要想知道dp[i][j],可以嘗試從第二個數的前面一直到最後乙個數的前面依次新增乘號,將最大的結果儲存至dp[i][j]中。就可以得到狀態轉移方程為:dp[i][j] = max(dp[i][j], dp[l-1][j-1] * (sum[i] – sum[l-1]));l為插入相乘的兩個數的後乙個數字的座標~

#include using namespace std;

#define max(a, b) a > b ? a : b;

long long int dp[16][16];

int sum[16];

int main()

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

for(int i = 2; i <= n; i++) }}

cout << dp[n][k];

return 0;

}

藍橋杯 ALGO 116 演算法訓練 最大的算式

演算法訓練 最大的算式 時間限制 1.0s 記憶體限制 256.0mb 問題描述 題目很簡單,給出n個數字,不改變它們的相對位置,在中間加入k個乘號和n k 1個加號,括號隨便加 使最終結果盡量大。因為乘號和加號一共就是n 1個了,所以恰好每兩個相鄰數字之間都有乙個符號。例如 n 5,k 2,5個數...

動態規劃 最大算式 藍橋杯ALGO 116

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

藍橋杯 演算法訓練 ALGO12

問題描述 如果乙個序列滿足下面的性質,我們就將它稱為擺動序列 1.序列中的所有數都是不大於k的正整數 2.序列中至少有兩個數。3.序列中的數兩兩不相等 4.如果第i 1個數比第i 2個數大,則第i個數比第i 2個數小 如果第i 1個數比第i 2個數小,則第i個數比第i 2個數大。比如,當k 3時,有...