动态规划法:合唱团问题

//思路:动态规划法
//类同斐波那契数列,考虑k和k-1数组之间的联系。
//但这边需要存储的即有最大正积,也需要存储最小负积。
//查询要在i-d和i+d范围内进行;寻找最大正积和最小负积。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

void calcuMaxMulti(int *array, int n, int k, int d,long *mark)
{
    //递归出口
    if (1 == k)
    {
        
        for (int i = 0; i < n; i++)
        {
            if (array[i] > 0)
            {
                mark[i] = array[i];
                mark[n + i] = 0;
            }                
            else
            { 
                mark[i] = 0;
                mark[n + i] = array[i];
            }                
        }
    }
    //递归
    else {
        calcuMaxMulti(array, n, k-1, d,mark);
        for (int i = n-1; i > k - 2; i--)
        {
            long max_Plus = 0;
            long min_Minus = 0;
            for (int j = i - 1; j >= i - d && j >= 0; j--)
            {
                if (array[i] * mark[j] > max_Plus)
                    max_Plus = array[i] * mark[j];
                if (array[i] * mark[j] < min_Minus)
                    min_Minus = array[i] * mark[j];
                if (array[i] * mark[j + n] < min_Minus)
                    min_Minus = array[i] * mark[j+n];
                if (array[i] * mark[j + n] > max_Plus)
                    max_Plus = array[i] * mark[j + n];
            }
            mark[i] = max_Plus;
            mark[i + n] = min_Minus;
        }
    }

    for (int i = 0; i < 2 * n; i++)
    {
        cout << mark[i] << " ";
    }
    cout << endl;
    //返回
}
long calCuMax(int *array,int k,int n,int d,long *mark)
{
    long max = 0;
    calcuMaxMulti(array, n, k, d,mark);
    for (int i = 0; i < n; i++)
    {
        if (mark[i] > max)
            max = mark[i];
    }
    //cout << max;
    //释放内存
    //free(mark);
    return max;
}

int main()
{
    int n, k, d,max;
    cin >> n;
    int *array = new int[n];
    long *mark = new long[2 * n];
    for (int i=0;i<2*n;i++)
    {
        mark[i] = 0;
    }
    for (int i = 0; i<n; i++)
    {
        cin >> array[i];
    }
    cin >> k >> d;
    cout << calCuMax(array,k,n,d,mark);
    delete [] mark;
    delete [] array;
    system("pause");
    return 0;

}

问题来自牛客网:https://www.nowcoder.com/practice/661c49118ca241909add3a11c96408c8?tpId=85&tqId=29830&tPage=1&rp=1&ru=/ta/2017test&qru=/ta/2017test/question-ranking

猜你喜欢

转载自blog.csdn.net/weixin_42034505/article/details/81219673