[LeetCode] 第 203 场周赛

第 203 场周赛


1560. 圆形赛道上经过次数最多的扇区

难度:Easy

题目描述:

1560. 圆形赛道上经过次数最多的扇区

解题思路:

  • 最终的路径只跟起点和终点有关系
  • 中间的路径都是均等出现的次数
class Solution {
public:
    vector<int> mostVisited(int n, vector<int>& rounds) {
        vector<int> ans;
        int start = rounds[0];
        int end = rounds[rounds.size() - 1];

        if (start <= end)
        {
            for (int i = start; i <= end; i++)
            {
                ans.push_back(i);
            }
        }else           // 起点大于终点的情况
        {
            for (int i = 1; i <= end; i++)
            {
                ans.push_back(i);
            }
            for (int i = start; i <= n; i++)
            {
                ans.push_back(i);
            }    
        }
        
        return ans;
    }
};

1561. 你可以获得的最大硬币数目

难度:Meduim

题目描述:

在这里插入图片描述

解题思路:

  • 数学题
class Solution {
public:
    int maxCoins(vector<int>& piles) {
        int group = piles.size() / 3;
        int ans = 0;
        // 降序排列
        sort(piles.begin(), piles.end());
        reverse(piles.begin(), piles.end());
          
        for(int i = 0; i < group; i++){
            ans += piles[2*i + 1];
        }
        
        return ans;
    }
};

1562. 查找大小为 M 的最新分组

难度:Meduim

题目描述:

1561. 查找大小为 M 的最新分组


1563. 石子游戏 V

难度:Hard

题目描述:

1563. 石子游戏 V

解题思路:

记忆搜索+dfs

  • dfs+记忆备忘录搜索
  • dp[L][R]表示stoneValue[L,R]一排中可以获得的最大得分
  1. dp[1][n]就是答案
  2. 终止条件:L==R,return 0
  3. 状态转移:遍历[L,R]中的中间点节点,根据划分sum[i] 的 左右大小,dp[L][R] = max(dp[L][i]+sum(L, i), dp[i+1][R] + sum[i+1, R])
  4. 更新dp[L][R]中记录的值
class Solution {
public:
    int dp[501][501];
    int sum[501];

    int stoneGameV(vector<int>& stoneValue) {
        memset(dp, -1, sizeof(dp));

        // 求前缀和
        sum[0] = 0;
        for (int i = 0; i < stoneValue.size(); i++)
        {
            sum[i+1] = sum[i] + stoneValue[i];
        }

        return dfs(1, stoneValue.size());
    }

    int dfs(int L, int R){
        if (dp[L][R] != -1)
        {
            return dp[L][R];    // 备忘录,已经遍历过
        }
        
        // 状态转移
        int val = 0;
        for (int i = L; i < R; i++)
        {
            int s1 = sum[i] - sum[L-1];
            int s2 = sum[R] - sum[i];

            if (s1 < s2)    // 后半段大,去掉后半段,前半段求和
            {
                val = max(val, s1 + dfs(L, i));
            }else if (s1 > s2)
            {
                val = max(val, s2 + dfs(i + 1, R));
            }else           // 两段相等时,都可以取
            {
                val = max(val, max(dfs(L, i), dfs(i+1, R)) + s1);
            }   
        }

        // 更新备忘录
        dp[L][R] = val;
        
        return dp[L][R];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值