动态规划之合唱团问题

匿名 (未验证) 提交于 2019-12-03 00:34:01
#include<iostream>
#include <math.h>
#include <limits.h>
#include<algorithm>
using namespace std;
int main()
{
    int studentNum;
    cin>>studentNum;
    int *energyNum=new int[studentNum];
    for(int i=0;i<studentNum;i++)
    {
        cin>>energyNum[i];
    }
    int k;
    int d;
    cin>>k>>d;
    long long int **maxF=new long long int*[k+1];
    long long int **minF=new long long int*[k+1];
    for(int i=0;i<k+1;i++)
    {
        maxF[i]=new long long int[studentNum];
        minF[i]=new long long int[studentNum];
        for(int j=0;j<studentNum;j++)
        {
            maxF[i][j]=0;
            minF[i][j]=0;
        }
    }
    for(int i=0;i<studentNum;i++)
    {
        maxF[1][i]=energyNum[i];
        minF[1][i]=energyNum[i];
    }
    for(int i=2;i<=k;i++)
    {
        for(int pos=i-1;pos<studentNum;pos++)
        {
            if(energyNum[pos]>=0)
            {
                long long int temp=INT_MIN;
                for(int pos1=max(pos-d,i-2);pos1<pos;pos1++)
                {
                    if(maxF[i-1][pos1]>temp)
                    {
                        temp=maxF[i-1][pos1];
                    }
                }
                maxF[i][pos]=temp*energyNum[pos];
                temp=INT_MAX;
                for(int pos1=max(pos-d,i-2);pos1<pos;pos1++)
                {
                    if(minF[i-1][pos1]<temp)
                    {
                        temp=minF[i-1][pos1];
                    }
                }
                minF[i][pos]=temp*energyNum[pos];
            }
            else
            {
                long long int temp=INT_MAX;
                for(int pos1=max(pos-d,i-2);pos1<pos;pos1++)
                {
                    if(minF[i-1][pos1]<temp)
                    {
                        temp=minF[i-1][pos1];
                    }
                }
                maxF[i][pos]=temp*energyNum[pos];
                temp=INT_MIN;
                for(int pos1=max(pos-d,i-2);pos1<pos;pos1++)
                {
                    if(maxF[i-1][pos1]>temp)
                    {
                        temp=maxF[i-1][pos1];
                    }
                }
                minF[i][pos]=temp*energyNum[pos];
            }
        }
    }
    long long int maxEnergy=maxF[k][k-1];
    for(int pos=k;pos<studentNum;pos++)
    {
        if(maxF[k][pos]>maxEnergy)
        {
            maxEnergy=maxF[k][pos];
        }
    }
    cout<<maxEnergy<<endl;

}

//数据类型一定要定义成long long int类型,因为int类型数据会产生溢出

转载请标明出处:动态规划之合唱团问题
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!