第 203 场周赛
1560. 圆形赛道上经过次数最多的扇区
难度:Easy
题目描述:
解题思路:
- 最终的路径只跟起点和终点有关系
- 中间的路径都是均等出现的次数
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
题目描述:
1563. 石子游戏 V
难度:Hard
题目描述:
解题思路:
记忆搜索+dfs
- dfs+记忆备忘录搜索
- dp[L][R]表示stoneValue[L,R]一排中可以获得的最大得分
- dp[1][n]就是答案
- 终止条件:L==R,return 0
- 状态转移:遍历[L,R]中的中间点节点,根据划分sum[i] 的 左右大小,dp[L][R] = max(dp[L][i]+sum(L, i), dp[i+1][R] + sum[i+1, R])
- 更新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];
}
};