连续最大积 HDU - 4561

连续最大积 HDU - 4561

小明和他的好朋友小西在玩一个游戏,由电脑随机生成一个由-2,0,2三个数组成的数组,并且约定,谁先算出这个数组中某一段连续元素的积的最大值,就算谁赢!

比如我们有如下随机数组:
2 2 0 -2 0 2 2 -2 -2 0
在这个数组的众多连续子序列中,2 2 -2 -2这个连续子序列的积为最大。

现在小明请你帮忙算出这个最大值。

Input

第一行输入一个正整数T,表示总共有T组数据(T <= 200)。
接下来的T组数据,每组数据第一行输入N,表示数组的元素总个数(1<= N <= 10000)。
再接下来输入N个由0,-2,2组成的元素,元素之间用空格分开。

Output

对于每组数据,先输出Case数。
如果最终的答案小于等于0,直接输出0
否则若答案是2^x ,输出x即可。
每组数据占一行,具体输出格式参见样例。

Sample Input

2
2
-2 0
10
2 2 0 -2 0 2 2 -2 -2 0

Sample Output

Case #1: 0
Case #2: 4

题目分析:

很显然,这题不能照搬最大连续和的做法,因为最大连续乘积不仅和最大连续乘积有关,而且还和最小连续乘积有关。但是题目只是要求2的指数,如果直接求最大乘积再去求指数的话肯定会溢出。因此我们可以这样定义x:若是x大于0,则表示2的x次方,若x>0,则表示-2^abs(x)。所以,我们可以定义最大连续乘积dpmax[i]和最小dpmin[i],则有一下递推式:
dpmax[i]=max(sign,max(ADD(dpmax[i-1])*sign,ADD(dpmin[i-1])*sign));
dpmin[i]=min(sign,min(ADD(dpmax[i-1])*sign,ADD(dpmin[i-1])*sign));
上式中ADD函数是将绝对值加一的函数,sign表示这个数的符号是1还是-1.所以就得出了一下AC代码(这题坑很多,我wa了好多次,要注意细节)

Accepted code

#include<cstdio>
using namespace std;

const int maxn=10005;

int num[maxn];
int dpmax[maxn],dpmin[maxn];

inline abs(int x)
{
    return x>0?x:-x;
}
inline max(int x,int y)
{
    return x>y?x:y;
}
inline min(int x,int y)
{
    return x>y?y:x;
}
int ADD(int x)
{
    int s=x>=0?1:-1;
    x=abs(x)+1;
    return s*x;
}

int main()
{
    int t;
    scanf("%d",&t);
    int kase=0;
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            scanf("%d",&num[i]);
        }

        dpmax[0]=dpmin[0]=num[0]/2;
        int res=dpmax[0];

        for(int i=1; i<n; i++)
        {
            int sign=num[i]/2;
            int temp=num[i]?1:0;
            if(temp==0)
                dpmax[i]=dpmin[i]=0;
            else
            {
                dpmax[i]=max(sign,max(ADD(dpmax[i-1])*sign,ADD(dpmin[i-1])*sign));
                dpmin[i]=min(sign,min(ADD(dpmax[i-1])*sign,ADD(dpmin[i-1])*sign));
            }

            res=max(res,dpmax[i]);
        }
        if(res<0)
            res=0;
        printf("Case #%d: %d\n",++kase,res);
    }
}

猜你喜欢

转载自blog.csdn.net/qingyingliu/article/details/80559259
今日推荐