最长子序列相关
来源:互联网 发布:艾默生网络能源vertiv 编辑:程序博客网 时间:2024/06/05 05:25
在《编程之美》看到这样的题:求连续子序列和最大
int LongMaxArrayCount(int data[],int n){int tempOne=0;int Targe=0;for (int i = 0; i < 20; i++){tempOne+=data[i];if (tempOne>tempOne+data[i+1]){if (tempOne>Targe){Targe=tempOne;}tempOne=0;i++;}}return Targe;}
变形1:N个整数,求其中任意N-1个数的乘积中的最大的一个,不能用除法。
N个数的乘积为P
(1)P的值为正,则除去一个最小的正数
(2)P的值为负,则去除一个最大的负数
(3)P的值为0,
a.有且只有一个0,若其他积为正,除去一个0,,否则除去一个最大的负数
b.2个以上0,除去一个0;
变形2:连续子序列积最大
【算法分析】
经过上面的分析,我们得到以下算法:
1、从左边开始,依次扫描数组,同时用tmp存储到当前的数的乘积。若tmp为0,则tmp置1,继续扫描;若tmp大于最大值result,则存储,继续扫描;
2、从右边开始,反方向重复过程1。
#include <iostream>#include <cstdlib>using namespace std;//找到长度为n的arr数组中最大的连续积long long FindMax(int arr[], int n){ if(n <= 0)return 0; long long result = arr[0]; //存储当前最大值 long long tmp = 1; //存储当前序列积 //从左往右扫描 for(int i = 0; i < n; i++){ tmp *= arr[i]; if(tmp == 0){tmp = 1;continue;} if(tmp > result)result = tmp; } //从右往左扫描 tmp = 1; for(int i = n-1; i >= 0; i--){ tmp *= arr[i]; if(tmp == 0){tmp = 1;continue;} if(tmp > result)result = tmp; } return result;}int main(){ int n; cin >> n; int *arr = new int[n]; for(int i = 0; i < n; i++) cin >> arr[i]; cout << FindMax(arr, n) << endl; system("pause"); return 0;}
转自:
http://bbs.csdn.net/topics/90460367
http://764293072.diandian.com/post/2011-09-23/5250369
0 0
- 最长子序列相关
- 最长子序列相关问题
- nyoj 17 最长子序列相关问题
- 最长递增子序列相关算法讲解(转载)
- 最长递增子序列(LIS)-总结与相关展开
- 【动态规划】最长上升子序列及其相关思想
- 最长公共子序列
- 最长公共子序列
- 最长递增子序列
- 最长递增子序列
- 最长公共子序列
- 最长公共子序列
- 最长递增子序列
- 最长公共子序列...
- 最长上升子序列
- 最长公共子序列
- 最长公共子序列
- 最长递增子序列
- POJ 1128
- C#格式化日期时间
- 翻转字符串(剑指offer42)
- 连续离散时间四种信号之间关系
- hadoop中mapreduce的 Type mismatch in value from map错误
- 最长子序列相关
- Algorithm学习笔记 --- Fibonacci polynomial(动态规划)
- Ajax 入门1:如何用Ajax建立一个简单的web应用程序(html + javascript + php)
- 数组 字典 复习
- 理解WebKit和Chromium: 调试Android系统上的Chromium
- 升级Ubuntu 12.04下的gcc到4.8
- 几个DSP高手的经验介绍(转)
- HDU-3328-Flipper(栈模拟)
- Knockout js类库学习笔记(一)数据绑定