描述

题目很简单,给出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之间)。

输出格式

输出文件仅一行包含一个整数,表示要求的最大的结果
最后的结果<=maxlongint

测试样例1

输入

5 2 
1 2 3 4 5

输出

120

备注

对于30%的数据,N<= 10;
对于全部的数据,N <= 100。

#include<iostream>
#include<cstdio>
#define maxn 105
using namespace std;
int n,k,num[maxn],dp[maxn][maxn],sum[maxn];
int main(){
cin>>n>>k;
for(int i = ;i <= n;i++){
scanf("%d",&num[i]);
dp[i][] = dp[i-][] + num[i];
sum[i] = dp[i][];
}
for(int i = ;i <= n;i++){
for(int j = ;j <= min(i-,k-);j++){
for(int r = i;r <= n;r++){
dp[r][j+] = max(dp[r][j+],dp[i-][j] * (sum[r] - sum[i-]));
dp[r][j] = max(dp[r][j],dp[i-][j] + (sum[r] - sum[i-]));
}
int now = min(i-,k);
for(int r = i;r <= n;r++){
dp[r][now] = max(dp[r][now],dp[i-][now] + (sum[r] - sum[i-]));
}
}
}
cout<<dp[n][k];
return ;
}

最新文章

  1. mysql 目录的了解以及Linux
  2. 关于兼容IE的一些策略
  3. Atitit.报名模块的管理
  4. HTML/CSS总结1
  5. Delete a node from BST
  6. HD1580(尼姆博弈入门)
  7. VBA删除表格最后一行
  8. SessionState的配置 [转载]
  9. [Leetcode][Python]23: Merge k Sorted Lists
  10. coco2dx c++ HTTP实现
  11. 转 Oracle DBCA高级玩法:从模板选择、脚本调用到多租户
  12. python函数前篇
  13. 安卓高级Fresco图片框架的时候
  14. mysql 替换字符中部分字符,替换使用指定字符
  15. Windows10家庭版用户无法在计算机管理更改权限的解决办法
  16. Ubuntu16.04 安装Teamviewer
  17. Windows + VS2013 + Dlib
  18. 深入学习 Git 工作流
  19. day 93 Restframwork
  20. Java并发编程指南

热门文章

  1. 调用wsdl接口,参数是xml格式
  2. AJPFX关于网络编程的理解
  3. mvc的生命周期
  4. CSS3实现边框线条动画特效
  5. iOS Programming NSUserDefaults
  6. 解决QTreeView不能设置列宽的问题
  7. Node.js——Buffer
  8. 当前主要的常用的PHP环境部署套件比较
  9. jpa,querydsl
  10. Chrome 引起的蓝屏 MULTIPLE_IRP_COMPLETE_REQUESTS (44)