ブルーブリッジ:式が最も大きいです

式が最も大きいです

問題の説明
非常に単純なタイトル先時間は、所与のN デジタル、充填の途中で、それらの相対位置を変更しないK 逓倍数とのための最終的な結果は、可能な限りズームされ、NK-1プラス記号(プラス何括弧)。乗算とプラス共同⼀N-1であるので、したがって、すべての隣接する二つの数字の間に正確⼀シンボルがあります。
例えば:N = 5、K = 2、5つの数字である1 2 3 4 5
            添加があってもよい。* 2 1 *(3 + 4 + 5)= 241 *(3 + 2)*(4 + 5)は45(1 + * 3 2)*(4 + 5)= 45 = ......
START入力フォーマット
テキスト合計⼆⾏部材を入力、二つの整数は、スペースで区切られた最初のフレームは⾏Nを表し、およびKを、(2 <= N <= 15、0 <= K <= N-1)。
第二ショット⾏ N ディジタル使用番目のスペースで区切られた(各数値0 。9 との間)。
出力フォーマット
出力ファイルのみ⼀⾏のいずれかの整数が含まれ、それは、要求された結果が最も大きいことを示し、
サンプルを失うSTART
5 2
1 2 3 4 5
サンプル出力
120
サンプル説明
(1 + 2 + 3)* 4 * 5 = 120
 
 
分析:ダイナミック企画・ソリューションを使用します。提供SUM [i]は私の最初の数の合計であり、JからKへの和が合計[K] -sum [J-1]です。
セットDP [i] [j]は、乗算の最大数からj番目の前の結果で、iの数を表します。DP [i]の[j]を知るために、あなたは前に試すことができます⾯⼀セカンドショット数をから
⾯添加順次乗算記号⼀の最後の数まで、結果は、最大の保全⾄DP [I] [J]です。
これは⽅状態遷移処理のために得ることができる:DP [I] [J] = MAX(DP [I]、[J]、DP [L-1] [J-1] *([I]和-sum [L-1 ])); Lは二つの数を乗じて挿入した後
⼀の数字を調整します。
 
 
#include <iostream>
using namespace std;
#define max(a, b) a > b ? a : b;
long long int dp[16][16];
int sum[16];
int main() {
 int n, k;
 cin >> n >> k;
 for(int i = 1; i <= n; i++) {
     int temp;
     cin >> temp;
     sum[i] = sum[i-1] + temp;
 }
 for(int i = 1; i <= n; i++) {
     dp[i][0] = sum[i];
 }
 for(int i = 2; i <= n; i++) {
     for(int j = 1; j <= i-1 && j <= k; j++) {
         for(int l = 2; l <= n; l++) {
             dp[i][j] = max(dp[i][j], dp[l-1][j-1] * (sum[i] -sum[l-1]));
         }
     }
 }
 cout << dp[n][k];
 return 0; 
}

 

公開された736元の記事 ウォンの賞賛123 ・は 80000 +を見て

おすすめ

転載: blog.csdn.net/S_999999/article/details/103391742