热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

最大的算式(BigExp)动态规划

还记得是去年做的DP题目,题目大意如下:给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每

还记得是去年做的DP题目,题目大意如下:

给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。例如:

N=5, K=25个数字分别为12345,可以加成:

1*2*(3+4+5)=24

1*(2+3)*(4+5)=45

   。。。

输入

输入文件共有二行,第一行为两个有空格隔开的整数,表示NK,其中(2<=N<=15, 0<=K<=N-1)。第二行为 N个用空格隔开的数字(每个数字在09之间)。

 

输出

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

 

样例

BIGEXP.IN

5 2

1 2 3 4 5


BIGEXP.OUT

120  // (1+2+3)*4*5=120


当时记得很清楚,老师给出的转移方程是:

F[i][j]表示前i个数字用j个乘号所有的最大值;

F[i][j]=max{F[i-1][j]+arr[i],[F[i-k][j-1]*sum[i-k+1][i]};

当时就是得了90分(据说在各大oj上能AC)

然后班里的大犇说:方程不对,要三维的区间DP。

去年的我实在太弱了,不提了,这几天突然想起来,没思考多久,代码就想出来了。


题目不能枚举最后一次乘法,这是不对的,遇到多的‘0’就要傻眼了,应该采用分治思想,把一段区间内一分为二,这样能保证得到的答案最大。


#include 
#include
#define N 20
#define m_inf -999999
using namespace std;
int f[N][N][N]; //dp三维数组
int sum[N][N]; //求i~j的总和
int arr[N]; //保存数字
int n,m;

void reset() //清空数组
{
memset(f,0,sizeof(f));
memset(arr,0,sizeof(arr));
memset(sum,0,sizeof(sum));
}



int search(int s,int e,int k) //记忆化搜索
{
if(e-s if(f[s][e][k]!=0)return f[s][e][k];
int &maxnum=f[s][e][k];
if(k==0)maxnum=sum[s][e]; //乘号个数为0时即为求和
else
for (int i=s;i {

for(int j=0;j<=k;++j)
maxnum=max(maxnum,search(s,i,j)+search(i+1,e,k-j)); //如果左右相加
for(int j=0;j maxnum=max(maxnum,search(s,i,j)*search(i+1,e,k-j-1));//如果左右相乘
}
return maxnum;

}
int main()
{
while(cin>>n>>m)
{
reset();
for (int i=1;i<=n;++i)
cin>>arr[i];
for (int i=1;i<=n;++i)
for (int j=i;j<=n;++j)
sum[i][j]+=sum[i][j-1]+arr[j];
cout< }
}

给一组有很多0的数据:

15 5
0 1 0 0 1 0 1 0 1 1 1 0 1 1 0

答案是12 


如果用错误的枚举最后一次的方法 答案是3



推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Navicat Premium 15 安装指南及数据库连接配置
    本文详细介绍 Navicat Premium 15 的安装步骤及其对多种数据库(如 MySQL 和 Oracle)的支持,帮助用户顺利完成软件的安装与激活。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍了在使用Visual Studio 2015进行项目开发时,遇到类向导弹出“异常来自 HRESULT:0x8CE0000B”错误的解决方案。通过具体步骤和实践经验,帮助开发者快速排查并解决问题。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 如何查找和管理计算机中的C盘临时文件
    本文详细介绍了如何在计算机中找到和管理C盘的临时文件,包括其具体路径、环境变量设置方法以及清理这些文件对系统性能的影响。对于希望优化系统性能和释放磁盘空间的用户来说,这是一篇非常有价值的参考。 ... [详细]
author-avatar
WINNIE双双围脖_370
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有