437贪心

lc3459

memo与方向枚举,在二维网格中查找以1开头、1和2交替出现的最长对角线(含转向)路径长度

  1. 确定参数与返回值:DFS参数包含当前位置 (i,j) 、移动方向 k 、转向权限 can_turn 、目标值 target ,返回以当前状态出发的最长交替路径长度。

  2. 设置终止条件:计算移动后新位置,若越界或网格值不等于 target ,则路径终止,返回0。

  3. 处理当前层逻辑:判断是否可读取记忆化缓存,若 can_turn 为 false 且缓存存在,直接返回缓存值避免重复计算。

  4. 递归遍历下一层:先沿原方向递归计算路径长度并加1,++若有转向权限,切换方向后再次递归,取两次递归结果的最大值。++

  5. 记忆化优化:当 can_turn 为 false 时,将当前递归计算的路径长度存入 memoijk ,供后续相同状态直接调用

class Solution {

static constexpr int DIRS42 = {{1, 1}, {1, -1}, {-1, -1}, {-1, 1}};

public:

int lenOfVDiagonal(vector<vector<int>>& grid) {

int m = grid.size(), n = grid0.size();

vector memo(m, vector<array<int, 4>>(n));

++auto dfs = \&(this auto&& dfs, int i, int j, int k, bool can_turn, int target) -> int {++

i += DIRSk0;

j += DIRSk1;

if (i < 0 || i >= m || j < 0 || j >= n || gridij != target) {

return 0;

}

// 只在 can_turn=false 时读取和写入 memo

if (!can_turn && memoijk) {

return memoijk;

}

++int res = dfs(i, j, k, can_turn, 2 - target) + 1;++

if (!can_turn) {

return memoijk = res;

}

int maxs4 = {m - i, j + 1, i + 1, n - j}; // 理论最大值(走到底)

k = (k + 1) % 4;

// 优化二:如果理论最大值没有超过 res,那么不递归

if (min(maxsk, maxs(k + 3) % 4) > res) {

res = max(res, dfs(i, j, k, false, 2 - target) + 1);

}

return res;

};

int ans = 0;

for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {

if (gridij != 1) {

continue;

}

int maxs4 = {m - i, j + 1, i + 1, n - j}; // 理论最大值(走到底)

for (int k = 0; k < 4; k++) { // 枚举起始方向

// 优化一:如果理论最大值没有超过 ans,那么不递归

if (maxsk > ans) {

ans = max(ans, dfs(i, j, k, true, 2) + 1);

}

}

}

}

return ans;

}

};

lc3457

贪心

要被舍弃的数尽可能的小

class Solution {

public:

long long maxWeight(vector<int>& pizzas) {

ranges::sort(pizzas, greater<int>());

int days = pizzas.size() / 4;

int odd = (days + 1) / 2;

long long ans = 0;

for (int i = 0; i < odd; i++)

ans += pizzasi;

for (int i = 0; i < days / 2; i++) {

ans += pizzasodd + i \* 2 + 1;

}

return ans;

}

};

lc3456

class Solution {

public:

bool hasSpecialSubstring(string s, int k) {

int n = s.size();

int cnt = 0;

for (int i = 0; i < n; i++) {

cnt++;

if (i == n - 1 || ++si != si + 1)++ {

if (cnt == k)

return true;

++cnt = 0;// try update后置0++

}

}

return false;

}

};

相关推荐
血小板要健康7 分钟前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
a1879272183114 分钟前
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
HugoStudio_SWAN2 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
青 春 记 忆3 小时前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
阳明山水4 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
桐盛科技4 小时前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算
Tongzhi20264 小时前
通芝科技考勤软件三大发展趋势:AI大模型、无感识别与数据底座
大数据·科技·算法·爬山算法
eBest数字化转型方案5 小时前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
residual_fan5 小时前
持续对比强化学习(Continual Contrastive Reinforcement Learning)论文分享
人工智能·算法·数据挖掘·数据分析
s_w.h6 小时前
【 计网 】序列化与反序列化
linux·服务器·网络·算法·bash