最长子序列相关

在《编程之美》看到这样的题:求连续子序列和最大

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.youkuaiyun.com/topics/90460367

http://764293072.diandian.com/post/2011-09-23/5250369






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值