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

2022-03-13 06:03:02 字數 1111 閱讀 2803

問題描述

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

樣例輸出

樣例說明

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

此題很明顯用動態規劃,也不難得出是區間型dp;

當然很多人應該對此題比較眼熟,我就第一時間聯想到了洛谷p1018 乘積最大

類似的我們可以用乙個陣列f[i][j]表示從左到右取i個數,插入j個乘號時的最大值。

於是很快得出轉移方程:

*f[i][j]=max(f[i][j],f[k-1][j-1]+sum[j]-sum[k-1])*

其中k表示在j個乘號中插入最後乙個乘號的位置,

sum是字首和陣列,sum[j]-sum[k-1]就可以求出從k到j加起來的和。

88分**:(有一點過不了,還懇請大佬指教)

#include #include #include #include #include using namespace std;    

int f[100][100];

int n, k;

int sum[100];

int main()

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

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

} }

cout << f[n][k];

return 0;

}

其實很多動規題仔細想一想都可以化陌生為熟悉

藍橋杯 最大的算式 動態規劃

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

藍橋杯 演算法訓練 最大的算式 (動態規劃)

演算法訓練 最大的算式 時間限制 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 ...