合唱团

首先注意到题目已经说明是动态规划。所以找状态转移方程,方程如下

maxV[i][j]=max(maxV[i][j],maxV[i][j-1]*cap[i])       minV[i][j]=min(minV[i][j],minV[i][j-1]*cap[i])

因为能力值有负值,可能会出现一个很小的值(负值)乘以当前值(负值)则会出现较大的值,所以考虑到这种情况,有两个状态转移方程。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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值