动态规划——看似dp的贪心问题最大乘积(蓝桥杯试题集)
题目链接:
http://lx.lanqiao.cn/problem.page?gpid=T136
问题描述
对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢?
输入格式
第一行一个数表示数据组数
每组输入数据共2行:
第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,
第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。
输出格式
每组数据输出1行,为最大的乘积。
样例输入
1
5 5
1 2 3 4 2
样例输出
48
一:首先要分离正负,两个负值乘积为正。做这道题时让我想起了按键盘http://blog.csdn.net/sm9sun/article/details/53241628
与其一样的是,按键盘保留大小写两种状态,那么本题也要保留正负最大值两种状态
二:类似于01背包,我们把m当作容量,每个数的体积都是1
这样一来每个数都面临取或者不取两种状态,当我们遍历到第i个物品时,我们要保留在i个物品中取j个物品的最大正负值即可
#include<stdio.h>
#include<math.h>
double fmax(double a,double b)
{return a>b?a:b;
}
double fmin(double a,double b)
{return a<b?a:b;
}
int main()
{double a[20];double fdp[20][20][20];double dp[20][20][20];int m,n,i,j,k,t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(i=1;i<=n;i++)scanf("%lf",&a[i]);for(i=0;i<=n;i++) for(j=0;j<=m;j++)for(k=0;k<=j;k++){ dp[i][j][k]=1;fdp[i][j][k]=1;}fdp[0][1][1]=dp[0][1][1]=a[1];for(i=1;i<=n;i++) //遍历n个数{for(j=1;j<=m&&j<=i;j++) //m为容量,从i个数中取j个数{for(k=1;k<=j;k++) //k遍历当我容量上限为j时取不同个数的最大值,这里与01背包不同,取值必须达到m容量,不能小于{ //所以每一个k都要记录下来if(a[i]>0){dp[i][j][k]=fmax(dp[i-1][j][k],dp[i-1][j-1][k-1]*a[i]);fdp[i][j][k]=fmin(fdp[i-1][j][k],fdp[i-1][j-1][k-1]*a[i]);}else{dp[i][j][k]=fmax(dp[i-1][j][k],fdp[i-1][j-1][k-1]*a[i]);fdp[i][j][k]=fmin(fdp[i-1][j][k],dp[i-1][j-1][k-1]*a[i]);}// printf("%.0lf,%.0lf ",dp[i][j][k],fdp[i][j][k]);}//printf("---");}//printf("\n");}printf("%.0lf\n",dp[n][m][m]);
}
return 0;
}
用dp思想的确可以解决这道题,不过后来看了网上的答案,发现其实还有更简单的方法,用贪心~
我们将正负数分组排序后,依次选取两个最大正值乘积,两个最大负值乘积即可~
注意,如果m为奇数时要再乘一个正数。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int main()
{int t, n, m;int num[20];scanf("%d", &t);while(t--){scanf("%d %d", &n, &m);for(int i = 0; i < n; i++)scanf("%d", &num[i]);sort(num, num+n);int i, j, a, b;i = j = 0;long long ans = 1;while(m){a = num[i]*num[i+1];b = num[n-j-1]*num[n-j-2];if(a>=b && m>=2){ans*=a;i+=2;m-=2;}else{ans*=num[n-j-1];j++;m--;}}printf("%lld\n", ans);}return 0;
}
所以说,也不能盲目的运用dp,有一些问题还是可以用贪心解决的。
动态规划——看似dp的贪心问题最大乘积(蓝桥杯试题集)相关推荐
- 动态规划——节点选择(蓝桥杯试题集)
题目链接: http://lx.lanqiao.cn/problem.page?gpid=T14 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相 ...
- 动态规划——K号数(蓝桥杯试题集)
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T13 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求 ...
- P0404 阿尔法乘积 蓝桥杯
算法提高 P0404 题目 时间限制:1.0s 内存限制:256.0MB 问题描述 计算一个无符号整数的阿尔法乘积.对于一个无符号整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的 ...
- 历届试题 包子凑数 C语言,蓝桥杯 试题 历届试题 包子凑数 dp+欧几里得算法
问题描述 小明几乎天天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼刚好能放Ai个包子.每种蒸笼都有很是多笼,能够认为是无限笼. 每当有顾客想买X个包子,卖包子的大叔就会迅速选 ...
- 和与乘积 蓝桥杯国赛全真模拟测试卷(上)
想要查看该套试卷的其它题解,请点击 题目描述 给定一个数列 A=(a1,a2,⋯,an),问有多少个区间 [L,R] 满足区间内元素的乘积等于他们的和,即⋅aL+1*aR=aL+aL+1 ...
- 0x51.动态规划 - 线性DP(习题详解 × 10)
目录 0x51.动态规划 - 线性DP 0x51.1 LIS问题 Problem A. 登山 (最长下降子序列) Problem B. 友好城市(思维) Problem C. 最大上升子序列和 0x5 ...
- 【LeetCode笔记】300. 最长递增子序列(Java、动态规划、二分法、贪心)
文章目录 题目描述 思路 & 代码 动态规划 O(n2n^2n2) 动态规划 + 二分法 + 贪心 O(nlognnlognnlogn) 二刷 题目描述 难点在于时间复杂度 O(n * log ...
- 动态规划(Dynamic Programming)与贪心算法(Greedy Algorithm)
文章目录 动态规划算法(Dynamic Programming) 动态规划问题的属性 应用实例:最长公共子序列问题(Longest Common Subsequence, LCS) 贪心算法(Gree ...
- 算法设计与分析:贪心算法 - 排课问题(DP与贪心的区别与应用)
文章目录 前言 贪心算法概念 排课问题 问题描述与分析 动态规划求解 简化问题应用贪心算法 总结 本文参考UCAS卜东波老师算法设计与分析课程撰写 前言 前面两大章节的内容分治思想与动态规划暂时告一段 ...
最新文章
- 字符串反转python_python字符串反转的四种方法详解
- Maven警告:“java使用了未经检查或不安全的操作。java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。“
- 假如有人把支付宝存储服务器炸了(附文末福利)
- 牛客练习赛71C-数学考试【容斥,dp】
- php最常用方法,php 常用方法
- 设置WordPress文章关键词自动获取,文章所属分类名称,描述自动获取文章内容,给文章的图片自动加上AlT标签...
- ASP.NET2.0导出Word文档(C#导出DOC)
- python内部函数和比外部函数快_Python:如何允许“内部函数”更改多个“外部函数”中的非局部变量...
- swoole2.0与java_swoole2.0试用说明
- linux curl获取头部信息,curl 命令如何获取 http header 返回的响应消息头
- php imagick下载,PHP安装imagemagick扩展imagick
- Android 控件之 Date Time 组件
- LINUX开机,直接进入终端,如何加载硬盘
- 介绍两种常见软件开发模式:“敏捷”和“瀑布”
- NTP时钟源(GPS时间源)介绍与分析
- 使用python3抓取链家二手房数据
- 这几年被分布式坑惨了,曝光十大坑
- linux环境下java输出乱码,linux java 输出乱码问题
- 由国内媒体的“非典”报道看信息生态问题-引文
- 七夕礼物 | 全网最火的钉子绕线图制作教程
热门文章
- 55 MM配置-评估和科目设置-定义账户分类参考
- SAP MM模块-实施顾问岗位-面试手册-MM模块技术面试清单
- 谷歌浏览器安卓_用谷歌服务更安全了,安卓手机可充当物理安全密匙
- PspNet在MMsegmentation框架下成功训练Pascal VOC2012数据集及踩坑实录
- Bootstrap-CSS-排版
- c语言位向量机伞_一文读懂C语言精华-指针变量和指向指针的指针
- bp 神经网络 优点 不足_基于粒子群算法和BP神经网络的多因素林火等级预测模型...
- 安装pytorch时,在安装 future-0.18.2.tar.gz (829 kB)时报错:ModuleNotFoundError: No module named ‘_ctypes’解决办法
- Ubuntu系统显卡驱动、CUDA、CUDNN安装(二CUDA和CUDNN)
- 解决http://localhost:3000/favicon.ico 的404 问题(含案例解析)