蓝桥杯 最大的算式

问题描述
  题目很简单,给出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

#include<iostream>
using namespace std;
typedef long long ll; 
ll dp[20][20];//dp[i][j]中i,j分别表示前i个数(包括i)和划分的次数
ll a[20];
int main()
{
	int n,K;
	cin >> n >> K;
	ll sum = 0;
	for(int i = 1; i <= n; i++) {
		cin >> a[i];
		sum += a[i];
		dp[i][0] = sum;//这里表示前i个数不划分的和
	}
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= K; j++)//划分的次数
			for(int k = j; k < i; k++)//这里应该从j开始,j个数才可以划分为j-1次
				dp[i][j] = max(dp[i][j],dp[k][j - 1] * (dp[i][0] - dp[k][0]));
	
	cout << dp[n][K] << endl;
	return 0; 
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.阶乘尾部0的个数 问题描述 给定非负整数n,计算n的阶乘尾部0的个数。 输入 输入数据有若干行,每行上有一个非负整数n,对应一种情形。 输出 对于每一种情形,直接输出结果、换行。 2.判断算式的正确性 问题描述 给定一个算式,该算式中只含一个四则运算符号,操作数及结果均为整数。要求判断该算式的正确性(规定:除法必须除尽才算正确)。 输入 输入数据有若干行,每行上有一个算式,对应一种情形。 输出 对于每一种情形,直接输出T(表示正确)或F(表示错误),换行。 3.计算一系列实数的个数、最小值、最大值和“平均值” 问题描述 给定若干个(大于0且不超过1024)实数,计算其中数据的个数(n)、最小值、最大值,以及“平均值”。此处的“平均值”定义为,若n>2,则需去掉一个最大值、一个最小值,剩下的n-2个数据的算术平均值;若n为1或2,则为普通的算术平均值。 输入 输入数据有多行,每一行上有若干个实数,对应一种情形(数据之间用一个空格字符分隔)。 输出 对于每一种情形,依次输出数据的个数、最小值、最大值、平均值、换行。其中数据之间用逗号和空格分隔,浮点型数据保留2位小数。 4.字符串倒置 问题描述 对于给定的字符串,将其按字符倒置。 输入 输入数据有多行。每一行为一个字符串(字符串长度小于1024,其中可能含有空格字符),对应一种情形。 输出 对于每一种情形,输出结果并换行。 5.字符在字符串中首次出现的位置 问题描述 给定一个字符、一个字符串(字符串的长度小于1024),计算该字符在字符串中首次出现的位置。 输入 输入数据有若干行。每两行对应一种情形,这两行中的第一行上有一个字符(请注意将该字符后面的换行字符“吃掉”),第二行上有一个字符串(字符串中可能含有空白字符)。 输出 对于每一种情形,输出计算结果(若字符不在字符串中,则输出0),然后换行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值