第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

???2533題解析:動態(tài)規(guī)劃求解最大乘積問題(附代碼實現(xiàn))

標簽:
C++

https://img1.sycdn.imooc.com/0af34368087c5a5909670695.jpg

一、题目解读

牛客12533题要求从n个人中选择k个人,使他们的能力值乘积最大,且相邻两人编号差不超过d。需考虑正负数的乘积组合情况,通过优化算法找到最优解。

二、解题思路

采用动态规划(Dynamic Programming)解决。定义二维数组dp_max[i][j]和dp_min[i][j],分别表示选j个人且最后一个人为i时的最大和最小乘积。通过状态转移方程,利用前j-1个人的乘积与当前能力值计算,兼顾正×正、负×负、正×负三种情况,避免重复计算。

三、解题步骤

1. 初始化:选1人时,乘积即其能力值。

2. 循环处理选j个人(2≤j≤k),当前人i从j到n遍历。

3. 前一个人l在[i-d, i-1]范围内,计算最大/最小乘积:

○ dp_max[i][j] = max(dp_max[l][j-1] * ability[i-1], dp_min[l][j-1] * ability[i-1])

○ dp_min[i][j] = min(dp_max[l][j-1] * ability[i-1], dp_min[l][j-1] * ability[i-1])

4. 最终结果:遍历dp_max[k][i](i=k到n)取最大值。

四、代码与注释

#include <iostream>
#include <vector>
#include <climits>
using namespace std;

long long maxProduct(int n, vector<int>& ability, int k, int d) {
    // dp_max[i][j]表示选j个人,最后一个人是i时的最大乘积
    // dp_min[i][j]表示选j个人,最后一个人是i时的最小乘积
    vector<vector<long long>> dp_max(n+1, vector<long long>(k+1, LLONG_MIN));
    vector<vector<long long>> dp_min(n+1, vector<long long>(k+1, LLONG_MAX));
    
    // 初始化:选1个人时就是自己的能力值
    for(int i = 1; i <= n; i++) {
        dp_max[i][1] = ability[i-1];
        dp_min[i][1] = ability[i-1];
    }
    
    for(int j = 2; j <= k; j++) { // 选j个人
        for(int i = j; i <= n; i++) { // 当前选第i个人
            // 前一个人只能在[i-d, i-1]范围内
            int start = max(j-1, i-d); // 至少需要j-1个人
            for(int l = start; l < i; l++) {
                // 考虑三种情况:正×正,负×负,正×负
                dp_max[i][j] = max(dp_max[i][j], max(dp_max[l][j-1] * ability[i-1], dp_min[l][j-1] * ability[i-1]));
                dp_min[i][j] = min(dp_min[i][j], min(dp_max[l][j-1] * ability[i-1], dp_min[l][j-1] * ability[i-1]));
            }
        }
    }
    
    // 找出选k个人时的最大乘积
    long long result = LLONG_MIN;
    for(int i = k; i <= n; i++) {
        result = max(result, dp_max[i][k]);
    }
    return result;
}

int main() {
    int n, k, d;
    cin >> n;
    vector<int> ability(n);
    for(int i = 0; i < n; i++) cin >> ability[i];
    cin >> k >> d;
    
    cout << maxProduct(n, ability, k, d) << endl;
    return 0;
}

五、总结

本解法通过动态规划将复杂问题分解为子问题,利用状态转移优化时间复杂度。关键在于处理正负数的乘积逻辑,确保最终结果正确。代码结构清晰,注释明确,适用于同类最大乘积问题的参考与学习。

来源:牛客网题解


點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優(yōu)惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消