求最小子序列和 求最小的正序列 求最大子序列乘积
2016-03-09 21:36
351 查看
数据结构与算法分析——c语言描述 练习2.12 答案
求最小子序列和 求最小的正序列,用了联机算法,线性复杂度
这道题求乘积最大一开始完全不会做,网上找了答案才知道是用动态规划。
求最大子序列乘积,用了动态规划,乘积不像加法,两个负数相乘可能会是最大的。
求最小子序列和 求最小的正序列,用了联机算法,线性复杂度
#include<stdio.h> #define MAXN 1000 int a[MAXN]; int n; int minSubsequenceSum() { int ThisSum, MinSum, i,min; ThisSum = MinSum = 0; int flag=1; min = a[0]; for (i = 0; i < n; i++) { ThisSum += a[i]; if (min > a[i]) min = a[i]; if (ThisSum < MinSum) { MinSum = ThisSum; flag = 1; } else if (ThisSum>0) ThisSum = 0; } if (flag) return MinSum; else return min; } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } printf("%d", minSubsequenceSum()); }
这道题求乘积最大一开始完全不会做,网上找了答案才知道是用动态规划。
求最大子序列乘积,用了动态规划,乘积不像加法,两个负数相乘可能会是最大的。
#include<stdio.h> #include<algorithm> using namespace std; #define MAXN 1000 int n,a[MAXN],maxA[MAXN],minA[MAXN]; int maxSubsequenceMul() { maxA[0] = minA[0] = a[0]; int ans = a[0]; for (int i = 1; i < n; i++) { maxA[i] = max(max(a[i], minA[i - 1] * a[i]), maxA[i - 1] * a[i]); minA[i] = min(min(a[i], minA[i - 1] * a[i]), maxA[i - 1] * a[i]); ans = max(ans, maxA[i]); } return ans; } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } printf("%d", maxSubsequenceMul()); }
相关文章推荐
- c++上机报告1-1
- oracle学习笔记--sqlplus基本命令
- 面向对象编程语言中的接口(Interface)
- new一个二维数组
- iOS之获取UITableViewCell中UITextField的值方法总结(二)
- hrbust 哈理工oj 网线【MST+Prim】
- 【J2EE十三个规范】业务层之EJB
- std::function std::bind
- 尼科彻斯定理
- HDU 3853 LOOPS(概率DP简单题)
- 训练趣题:黑与白 有A、B、C、D、E五人,每人额头上都帖了一张黑或白的纸。(此处用javascript实现)
- 每日总结-2016年3月9日
- 小菜鸟装VM之后装linux
- 【转】人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[5]——一树双花
- 整洁的代码
- UGUI(七)_UI节点制作
- 002第二部分 [函数 / 生成器]
- 高性能网站架构设计之缓存篇(5)- Redis 集群(中)
- 在Windows Server 2012 Failover Cluster环境下安装SQL Server的注意事项
- 《Qt5学习笔记6》信号和槽的多种组合