Leetcode 1395. 统计作战单位数 (DP)

117 篇文章 0 订阅
48 篇文章 1 订阅
这篇博客介绍了一个关于如何使用动态规划方法解决数组分组问题的具体实例。给定一排士兵的评分,需要组成满足特定顺序条件的作战单位。通过状态转移方程,可以计算出满足条件的作战单位数量。示例展示了不同评分数组下的解决方案,并提供了相应的代码实现。动态规划在这里起到了关键作用,有效地计算了所有可能的组合。
摘要由CSDN通过智能技术生成

n 名士兵站成一排。每个士兵都有一个 独一无二 的评分 rating 。

每 3 个士兵可以组成一个作战单位,分组规则如下:

从队伍中选出下标分别为 i、j、k 的 3 名士兵,他们的评分分别为 rating[i]、rating[j]、rating[k]
作战单位需满足: rating[i] < rating[j] < rating[k] 或者 rating[i] > rating[j] > rating[k] ,其中 0 <= i < j < k < n
请你返回按上述条件可以组建的作战单位数量。每个士兵都可以是多个作战单位的一部分。


示例 1:

输入:rating = [2,5,3,4,1]
输出:3
解释:我们可以组建三个作战单位 (2,3,4)(5,4,1)(5,3,1) 。
示例 2:

输入:rating = [2,1,3]
输出:0
解释:根据题目条件,我们无法组建作战单位。
示例 3:

输入:rating = [1,2,3,4]
输出:4
 

【思路】:
dp[i].three = dp[i - 1].three + 所有比rating[i]大的dp[j].twoDesc +
所有比rating[i]小的dp[j].twoAsc

dp[i].twoDesc = 前面所有比rating[i]大的个数
dp[i].twoAsc = 前面所有比rating[i]小的个数


其实稍加分析就发现,当前位置的数量实际上与前i-1位有关系。所以可以设出以上的状态转移。


【代码】:
不得不说,用结构体数组来作为dp数组真的很方便做题!

/**
 * @param {number[]} rating
 * @return {number}
 */ 
var numTeams = function(rating) {
    var dp = new Array(rating.length);
    dp[0] = {three:0, twoDesc:0,twoAsc:0};
    for(let i = 1;i < rating.length;i++){
        dp[i] = {};
        let val1 = 0;
        let val2 = 0;
        for(let j = 0;j < i;j++){
            if(rating[j] > rating[i]) val1 += dp[j].twoDesc;
            else if(rating[j] < rating[i]) val2 += dp[j].twoAsc;
        }
        dp[i].three = dp[i - 1].three + val1 + val2;
        let smallCnt = 0;
        let bigCnt = 0;
        for(let j = 0;j < i;j++){
            if(rating[j] > rating[i])   bigCnt++;
            else if(rating[j] < rating[i]) smallCnt++;
        }
        dp[i].twoAsc = smallCnt;
        dp[i].twoDesc = bigCnt;
    }
    return dp[dp.length - 1].three;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值