最长子序列相关

来源:互联网 发布:艾默生网络能源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
原创粉丝点击