《最大连续子序列乘积》解法(动态规划)

若题目要求的是最大连续子序列和,则易确定状态转移方程为:
dp[i]=max(data[i],dp[i-1]+data[i])(dp[i]为以第i个数结尾的连续子序列最大和)

但乘积存在负负得正的问题,即原本非常小的负数成了一个负数反而变大了。

为了解决问题。须要定义两个数组:

dp1[i]:以第i个数结尾的连续子序列最大乘积
dp2[i]:以第i个数结尾的连续子序列最小乘积
转移方程:
dp1[i]=max(data[i],dp1[i-1]*data[i],dp2[i-1]*data[i]);

dp2[i]=min(data[i],dp1[i-1]*data[i],dp2[i-1]*data[i]);


又而数据乘积太大,避免溢出,用long long存储。有了转移方程,为了优化空间,可以用fmax与fmin记录,同时记录此时ans。由此可以得。


#include
#include 
#include
using namespace std;
long long a[100001];
long long ans=0;
void f(int n)
{
	long long fmax,fmin,i,fa,fi;
	ans=fmax=fmin=a[0];
	for(i=1;i

你可能感兴趣的:(算法学习)