#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;
#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类型数据会产生溢出
转载请标明出处:动态规划之合唱团问题
文章来源: 动态规划之合唱团问题