问题描述 题目很简单,给出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
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 #define LEN 15 4 #define MAX(X,Y) (X)>(Y)?(X):(Y) 5 6 int main(void) 7 { 8 int i,j,h; 9 int n,k; 10 long long dp[LEN+1][LEN+1]; //列代表乘号个数 11 memset(dp,0,sizeof(dp)); 12 13 scanf("%d%d",&n,&k); 14 for (i=1 ; i<=n ; i++) 15 { 16 scanf("%d",&dp[i][0]); 17 dp[i][0] += dp[i-1][0]; //乘号个数为0时 18 } 19 20 for (i=1 ; i<=n ; i++) //遍历i个数 21 { 22 for (j=1 ; j<=k&&j<=i-1 ; j++)//乘号的个数 23 { 24 for (h=2 ; h<=i ; h ++) //乘号的位置(第i个数的前面) 25 dp[i][j] = MAX(dp[i][j],dp[h-1][j-1]*(dp[i][0]-dp[h-1][0])); 26 } 27 } 28 29 printf("%lld",dp[n][k]); 30 31 return 0; 32 }
参考:https://www.cnblogs.com/cao-lei/p/6690827.html
解题思路:
建立一个二维数组,其中列表示乘号的个数
将输入的数字存储第一列中(从1开始存储),每次存储时增加前一个数字(即前n个数的和)
然后计算最大式,即:当前值 = max(当前值 ,前n个数最大值*(当前和 - 前n个数和) )
将前n个数的最大值情况保存下来,供下次使用
最后输出dp[n][k]即为答案