动态规划 最大的算式
2016-04-24 12:23
267 查看
题目描述
题目很简单,给出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
……
典型的动态规划问题,用f[i][j]表示在前i个数中插入j个乘号所能达到的最大运算和,可以得到状态转移方程f[i][j]=max(f[i][j],f[i-l][j-1]*(sum[i]-sum[l-1]),其中2<=l<=i,sum数组记录的是前i个数的总和。初始值f[i][0]=sum[i],1<=i<=n。
题目很简单,给出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典型的动态规划问题,用f[i][j]表示在前i个数中插入j个乘号所能达到的最大运算和,可以得到状态转移方程f[i][j]=max(f[i][j],f[i-l][j-1]*(sum[i]-sum[l-1]),其中2<=l<=i,sum数组记录的是前i个数的总和。初始值f[i][0]=sum[i],1<=i<=n。
#include<bits/stdc++.h> using namespace std; typedef long long LL; LL f[120][120],sum[120]; int n,k,t; int main(){ scanf("%d%d",&n,&k); memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++){ scanf("%d",&t); sum[i]=sum[i-1]+t; } for(int i=1;i<=n;i++) f[i][0]=sum[i]; for(int i=2;i<=n;i++){ t=min(i-1,k); for(int j=1;j<=t;j++) for(int l=2;l<=i;l++) f[i][j]=max(f[i][j],f[l-1][j-1]*(sum[i]-sum[l-1])); } printf("%I64d\n",f [k]); return 0; }
相关文章推荐
- Nginx和Apache配置301跳转
- CSS盒子模型
- angular $apply()以及$digest()讲解1
- More Effective C#
- 算法提高 学霸的迷宫
- ubuntu自定义桌面左上角“Ubuntu 桌面”
- c++上机实验
- 【Leetcode】:94. Binary Tree Inorder Traversal 问题 in JAVA
- 数据库性能之--ibatis cache应用
- 游戏类
- 工欲善其事必先利其器之javascript调试工具
- 简评搜狗输入法(ios端)
- 杭电1253胜利大逃亡
- zoj3769(分组背包)
- iOS学习笔记42-Swift(二)函数和闭包
- JS自定义事件绑定--通过URL触发不同的点击事件
- spring数据连接池配置参数
- 我是一个线程
- Hibernate HQL 插入更新删除
- webAPI 自动生成帮助文档