tyvj1045 最大的算式
2024-09-08 08:12:09
描述
题目很简单,给出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 ;
}
最新文章
- mysql 目录的了解以及Linux
- 关于兼容IE的一些策略
- Atitit.报名模块的管理
- HTML/CSS总结1
- Delete a node from BST
- HD1580(尼姆博弈入门)
- VBA删除表格最后一行
- SessionState的配置 [转载]
- [Leetcode][Python]23: Merge k Sorted Lists
- coco2dx c++ HTTP实现
- 转 Oracle DBCA高级玩法:从模板选择、脚本调用到多租户
- python函数前篇
- 安卓高级Fresco图片框架的时候
- mysql 替换字符中部分字符,替换使用指定字符
- Windows10家庭版用户无法在计算机管理更改权限的解决办法
- Ubuntu16.04 安装Teamviewer
- Windows + VS2013 + Dlib
- 深入学习 Git 工作流
- day 93 Restframwork
- Java并发编程指南