Description
给出N个1-9的数字 (v1,v2,…,vN), 不改变它们的相对位置, 在中间加入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
等等.
Input
第一行输入M(M<=10)表示有M组数据。每组数据输入两整数N和K(N<=20, K<20), 接下来输入N个1-9的数字。
Output
输出M行正整数,第i行表示第i组数据的最大结果, 你可能需要用long long类型存储结果。
Sample Input
2
5 2
1 2 3 4 5
6 3
1 2 3 4 5 6
Sample Output
120
720
#include<iostream>
#include<cmath>
#include<limits.h>
const int MAX = INT_MAX;
using namespace std;
int sum(int a[], int s, int e)
{
int sum = 0;
for (int i = s; i <= e; i++)
sum += a[i];
return sum;
}
int main()
{
int T;
cin >> T;
while (T--)
{
long long dp[21][21] = { 0 };
int arr[21];
int N, K;
cin >> N >> K;
for (int i = 1; i <= N; i++)
{
cin >> arr[i];
}
for (int i = 1; i <= N; i++)
dp[i][0] = sum(arr, 1, i);
for (int i = 2; i <= N; i++) {
for (int j = 1; j <= min(K,i-1); j++){
for (int k = 2; k <= i; k++)
{
dp[i][j] = max((dp[k-1][j-1] * (sum(arr,k,i))),dp[i][j]);
}
}
}
cout << dp[N][K] << endl;
}
return 0;
}