[leetcode] 798 得分最高的最小轮调 - 思维dp

简介: 轮调实际上是这个样子的:每次讲最前面的元素放到数组最后,然后将所有元素集体向前移动一位在当前值a [ i ] ≤ i 的时候会获得1 分,问最大的分是多少?先说明一个事实:一次轮调之后,对于除了最前面的每个数,他的下标会减小1 ,而对于最前面的那个数,他的下标直接变为最大大致分为以下三种情况:本来a [ i ] 就小于下标i ,轮调之后下标减小值不变,所以依旧会获得1 分本来a [ i ] = = i ,轮调之后,下标减小而值不变,所以值就比下标大1 ,所以说会失去1 分本来a [ i ] > i,轮调之后,下标更小,值依旧会大于下标,所以依旧不得分

题目链接


ed2b47759ab348778c459032df2b74c7.png

轮调实际上是这个样子的:

每次讲最前面的元素放到数组最后,然后将所有元素集体向前移动一位

在当前值a [ i ] ≤ i 的时候会获得1 分,问最大的分是多少?

先说明一个事实:

一次轮调之后,对于除了最前面的每个数,他的下标会减小1 ,而对于最前面的那个数,他的下标直接变为最大

大致分为以下三种情况:


本来a [ i ] 就小于下标i ,轮调之后下标减小值不变,所以依旧会获得1 分

本来a [ i ] = = i ,轮调之后,下标减小而值不变,所以值就比下标大1 ,所以说会失去1 分

本来a [ i ] > i,轮调之后,下标更小,值依旧会大于下标,所以依旧不得分

在最前面的数,一次轮调之后,被放到最大的下标的位置,会得到1 分

我们用 dp[i] 表示在第i 次轮调之后会得到的分数,那么就有:

dp[i]=dp[i−1]−x+1

其中,x 表示i − 1 次轮调时下标和值相等的个数{

在这里x 可以预处理得到

}

式中的 + 1 是为了解决数组最前面的数到数组最后的最大下标处的贡献值

dp[0]=未轮调的时候的得分

因为之和前一个关系有关,所以我们可以只用一个变量解决,记录最大值处的下标返回即可


Code:


class Solution {
public:
    int bestRotation(vector<int>& nums) {
        int val = 0;
        const int n = nums.size();
        int a[n+1],pos = 0;
        memset(a,0,sizeof a);
        for(int i = 0; i < n;i ++) {
            if(nums[i] <= i) val ++;
        }
        int mxval = val;
        for(int i = 0; i < n;i ++) {
            if(i >= nums[i]) a[i-nums[i]] ++;
            else a[i + n - nums[i]] ++;
        }
        for(int i=1;i<n;i++) {
            val = val - a[i-1] + 1;
            if(val > mxval) {
                val = mxval;
                pos = i;
            }
        }
        return pos;
    }
};


7b5f310e73a04be68ba04f5ed6f868a1.png


文章知识点与官方知识档案匹配,可进一步学习相关知识

算法技能树leetcode-动态规划22-括号生成8256 人正在系统学习中


目录
相关文章
力扣.300(一个比较隐蔽的dp)
力扣.300(一个比较隐蔽的dp)
|
算法 测试技术 Android开发
LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
74 2
LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题
|
5月前
|
索引
力扣随机一题 6/26 哈希表 数组 思维
力扣随机一题 6/26 哈希表 数组 思维
39 0
|
6月前
力扣337.打家劫舍3(树形dp)
力扣337.打家劫舍3(树形dp)
|
5月前
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
|
6月前
力扣 790. 多米诺和托米诺平铺(一维dp)
力扣 790. 多米诺和托米诺平铺(一维dp)
|
6月前
|
算法
力扣123. 买卖股票的最佳时机 III(状态dp)
力扣123. 买卖股票的最佳时机 III(状态dp)
LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
|
算法
dp算法 力扣309最佳买卖股票时机含冷冻期
dp算法 力扣309最佳买卖股票时机含冷冻期
|
6月前
|
机器学习/深度学习 算法 测试技术
【单调栈】LeetCode:2818操作使得分最大
【单调栈】LeetCode:2818操作使得分最大