[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)
|
8月前
|
算法 测试技术 Android开发
LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
38 2
LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题
|
4月前
|
机器学习/深度学习 算法 测试技术
【单调栈】LeetCode:2818操作使得分最大
【单调栈】LeetCode:2818操作使得分最大
|
4月前
|
算法 测试技术 C#
【二分查找】【双指针】LeetCode:2565最少得分子序列
【二分查找】【双指针】LeetCode:2565最少得分子序列
|
9月前
|
索引
LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
|
9月前
|
算法
dp算法 力扣309最佳买卖股票时机含冷冻期
dp算法 力扣309最佳买卖股票时机含冷冻期
|
9月前
|
存储 算法 Java
dp算法 力扣174地下城游戏
dp算法 力扣174地下城游戏
|
5月前
|
算法 测试技术 C++
【二分查找】【双指针】LeetCode:2565最少得分子序列
【二分查找】【双指针】LeetCode:2565最少得分子序列
|
5月前
力扣370周赛 -- 第三题(树形DP)
力扣370周赛 -- 第三题(树形DP)
|
9月前
|
算法 Android开发
LeetCode 周赛上分之旅 #41 结合离散化的线性 DP 问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
47 0