首先注意到题目已经说明是动态规划。所以找状态转移方程,方程如下
因为能力值有负值,可能会出现一个很小的值(负值)乘以当前值(负值)则会出现较大的值,所以考虑到这种情况,有两个状态转移方程。i可以理解为状态,j为第j个数(从0开始)。注意到两个值的间隔在1-d之间,所以在考虑最值的时候要把在这个区间的值都遍历一遍。每算完一个状态,我们都要比较一下数目达到要求的那个状态的最值,这样最后的结果就是所有状态下可能的最值。代码如下
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,k,d;
cin>>n;
int* cap=new int[n];
for(int i=0;i<n;i++){
cin>>cap[i];
}
cin>>k>>d;
long maxV[n][k];
long minV[n][k];
for(int i=0;i<n;i++){//初始化
maxV[i][0]=cap[i];
minV[i][0]=cap[i];
for(int j=1;j<k;j++){
maxV[i][j]=1;
minV[i][j]=1;
}
}
long result=cap[0];
for(int i=0;i<n;i++){
for(int j=1;j<k;j++){
for(int m=i-1;m>=max(i-d,0);m--)
{
maxV[i][j]=max(maxV[i][j],max(maxV[m][j-1]*cap[i],minV[m][j-1]*cap[i]));
minV[i][j]=min(minV[i][j],min(maxV[m][j-1]*cap[i],minV[m][j-1]*cap[i]));
}
}
result=max(result,maxV[i][k-1]);
}
cout<<result<<endl;
delete [] cap;
return 0;
}