dijk|tire+floyd+dp %

算法 数学归纳+反证的角度 推理总结的思路

lc2575

% 步步取模 实现整数拆分

class Solution {

public:

vector<int> divisibilityArray(string word, int m) {

vector<int> ans(word.length());

long long x = 0;

for (int i = 0; i < word.length(); i++) {

++x = (x * 10 + (wordi - '0')) % m;++

ansi = x == 0;

}

return ans;

}

};

lc2577

dijk 单源最短路 一开始只有一个起点 不可有负数

pq贪心更新 一步一步的取出 确定 选择

class Solution {

static constexpr int dirs42 = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

public:

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

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

if (grid01 > 1 && grid10 > 1) // 无法「等待」

return -1;

int dismn;

memset(dis, 0x3f, sizeof(dis));

dis00 = 0;

priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<>> pq;

pq.emplace(0, 0, 0);

for (;;) { // 可以等待,就一定可以到达终点

autod, i, j = pq.top();

pq.pop();

if (d > disij) continue;

if (i == m - 1 && j == n - 1)

// 找到终点,此时 d 一定是最短路

return d;

for (auto &q : dirs) {

// 枚举周围四个格子

int x = i + q0, y = j + q1;

if (0 <= x && x < m && 0 <= y && y < n) {

int nd = max(d + 1, gridxy);

nd += (nd - x - y) % 2;

// nd 必须和 x+y 同奇偶

++if (nd < disxy) {
disxy = nd;
++ // 更新最短路

pq.emplace(nd, x, y);

}

}

}

}

}

};

floyd 多源最短路

一种 选/不选 的dp思想

class Solution {

public:

int findTheCity(int n, vector<vector<int>>& edges, int distanceThreshold) {

vector w(n, vector<int>(n, INT_MAX / 2)); // 防止加法溢出

for (auto& e: edges) {

int x = e0, y = e1, wt = e2;

wxy = wyx = wt;

}

vector memo(n, vector(n, vector<int>(n)));

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

if (k < 0) { // 递归边界

return wij;

}

auto& res = memokij; // 注意这里是引用

if (res) { // 之前计算过

return res;

}

return res = min(dfs(k - 1, i, j), dfs(k - 1, i, k) + dfs(k - 1, k, j));

};

int ans = 0;

int min_cnt = n;

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

int cnt = 0;

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

if (j != i && dfs(n - 1, i, j) <= distanceThreshold) {

cnt++;

}

}

if (cnt <= min_cnt) { // 相等时取最大的 i

min_cnt = cnt;

ans = i;

}

}

return ans;

}

};

lc2977

tire+floyd+dp

题解

struct Node {

Node* son26{};

int sid = -1; // 字符串的编号

};

class Solution {

public:

long long minimumCost(string source, string target, vector<string>& original, vector<string>& changed, vector<int>& cost) {

Node* root = new Node();

int sid = 0;

auto put = \&(string& s) -> int {

Node* o = root;

for (char b: s) {

int i = b - 'a';

if (o->soni == nullptr) {

o->soni = new Node();

}

o = o->soni;

}

if (o->sid < 0) {

o->sid = sid++;

}

return o->sid;

};

// 初始化距离矩阵

int m = cost.size();

vector dis(m * 2, vector<int>(m * 2, INT_MAX / 2));

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

disii = 0;

}

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

int x = put(originali);

int y = put(changedi);

disxy = min(disxy, costi);

}

// Floyd 求任意两点最短路

for (int k = 0; k < sid; k++) {

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

if (disik == INT_MAX / 2) { // 加上这句话,巨大优化!

continue;

}

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

disij = min(disij, disik + diskj);

}

}

}

int n = source.size();

vector<long long> f(n + 1);

for (int i = n - 1; i >= 0; i--) {

// 不修改 sourcei

fi = sourcei == targeti ? fi + 1 : LONG_LONG_MAX / 2;

Node* p = root;

Node* q = root;

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

p = p->sonsource\[j - 'a'];

q = q->sontarget\[j - 'a'];

if (p == nullptr || q == nullptr) {

break;

}

if (p->sid < 0 || q->sid < 0) {

continue;

}

// 修改从 i 到 j 的这一段

int d = disp-\>sidq-\>sid;

if (d < INT_MAX / 2) {

fi = min(fi, disp-\>sidq-\>sid + fj + 1);

}

}

}

return f0 < LONG_LONG_MAX / 2 ? f0 : -1;

}

};

相关推荐
萧西待水4 小时前
奥赛一本通 1447 靶形数独
算法·深度优先
泯泷6 小时前
那段文字是谁删的?Yjs 14 正式版之前,一套删除归属方案的实现与边界
前端·javascript·算法
hold?fish:palm6 小时前
34 合并K个升序链表
javascript·算法·链表
Navigator_Z8 小时前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
语戚10 小时前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
青山木10 小时前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
这料鬼有毒11 小时前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
政企项目老覃12 小时前
边缘 AI 推理部署:安防零售场景下的模型裁剪与端侧落地实践
人工智能·程序人生·算法·性能优化·vllm
GreenTea14 小时前
发布 3 天登顶 HN:不生成一个字的模型 Jev,我把它的源码和黑料都扒了一遍
前端·后端·算法
庖丁解牛14 小时前
无穷小不是一个“神秘小数”,而是一场奔向 0 的过程
算法