牛客网2017校招真题--合唱团

                           牛客网2017校招真题--合唱团

题目描述

 

解题思路

代码

#include<iostream>
#include<vector>
#include<algorithm>                                                              // max和min函数包含在该头文件中
using namespace std;
int main()
{
    int n;
    while (cin >> n)                                                            // 输入n
    {
        vector<int> a(n);                                                      // 定义vector类的对象
        for (int i = 0; i < n; i++)
        {
            cin >> a[i];                                                      // n 个整数,按顺序表示每个学生的能力值 ai
        }
        int k, d;
        cin >> k >> d;                                                       //输入k和d
        vector<vector<long long>> dp_max(n, vector<long long>(k + 1, 0));   //创建n*(k+1)的二维数组dp_max
        vector<vector<long long>> dp_min(n, vector<long long>(k + 1, 0));   //创建n*(k+1)的二维数组dp_min

        //dp_max[i][j],dp_min[i][j]分别表示以第i个人为结尾,选择j个人的最大乘积和最小乘积
        for (int i = 0; i < n; i++)
        {
            dp_max[i][1] = a[i];                                           //当以第i个人为结尾,选择1个人的最大乘积
            dp_min[i][1] = a[i];                                          //当以第i个人为结尾,选择1个人的最小乘积
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 2; j <= k; j++)
            {
                if (i >= j)
                {
                    for (int m = max(0, i - d); m <= i - 1; m++)
                    {
                        dp_max[i][j] = max(dp_max[i][j], max(dp_max[m][j - 1] * a[i], dp_min[m][j - 1] * a[i]));
                        dp_min[i][j] = min(dp_min[i][j], min(dp_min[m][j - 1] * a[i], dp_max[m][j - 1] * a[i]));
                    }
                }
                
            }
        }
        long long max_value = 0;
        for (int i = 0; i < n; i++)
        {
            max_value = max(max_value, dp_max[i][k]);                     //  最大能力值的乘积
        }
        cout << max_value << endl;
    }
    system("pause");                                                             // 程序运行完后不让窗口一闪而过
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值