news 2026/4/18 2:04:04

回溯+位运算|前缀和优化背包

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
回溯+位运算|前缀和优化背包

汉字写一遍代码思路 可以提升和人沟通 和加深理解

所以不可以只写完代码就去去丸了 还是要复习

lc756

class Solution {
public:
bool pyramidTransition(string bottom, vector<string>& allowed) {
vector<int> groups[7][7];
for (auto& s : allowed) {
// A~F -> 1~6
groups[s[0] & 31][s[1] & 31].push_back(s[2] & 31);
}

int n = bottom.size();
vector<int> pyramid(n);
for (int i = 0; i < n; i++) {
pyramid[n - 1] |= (bottom[i] & 31) << (i * 3); // 等价于 pyramid[n-1][i] = bottom[i]&31
}

vector<uint8_t> vis(1 << ((n - 1) * 3));

auto dfs = [&](this auto&& dfs, int i, int j) -> bool {
if (i < 0) {
return true;
}

if (vis[pyramid[i]]) {
return false;
}

if (j == i + 1) {
vis[pyramid[i]] = true;
return dfs(i - 1, 0);
}

for (int top : groups[pyramid[i + 1] >> (j * 3) & 7][pyramid[i + 1] >> ((j + 1) * 3) & 7]) {
pyramid[i] &= ~(7 << (j * 3)); // 清除之前填的字母,等价于 pyramid[i][j] = 0
pyramid[i] |= top << (j * 3); // 等价于 pyramid[i][j] = top
if (dfs(i, j + 1)) {
return true;
}
}
return false;
};

return dfs(n - 2, 0);
}
};

lc3333

前缀和优化多重背包

class Solution {
public:
int possibleStringCount(string word, int k) {
int n = word.size();
if (n < k) { // 无法满足要求
return 0;
}

const int MOD = 1'000'000'007;
vector<int> cnts;
long long ans = 1;
int cnt = 0;
for (int i = 0; i < n; i++) {
cnt++;
if (i == n - 1 || word[i] != word[i + 1]) {
// 如果 cnt = 1,这组字符串必选,无需参与计算
if (cnt > 1) {
if (k > 0) {
cnts.push_back(cnt - 1);
}
ans = ans * cnt % MOD;
}
k--; // 注意这里把 k 减小了
cnt = 0;
}
}

if (k <= 0) {
return ans;
}

int m = cnts.size();
vector f(m + 1, vector<int>(k));
ranges::fill(f[0], 1);
vector<int> s(k + 1);
for (int i = 0; i < m; i++) {
// 计算 f[i] 的前缀和数组 s
for (int j = 0; j < k; j++) {
s[j + 1] = (s[j] + f[i][j]) % MOD;
}
// 计算子数组和
for (int j = 0; j < k; j++) {
f[i + 1][j] = (s[j + 1] - s[max(j - cnts[i], 0)]) % MOD;
}
}

return (ans - f[m][k - 1] + MOD) % MOD; // 保证结果非负
}
};

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 2:02:26

PostgreSQL 时间/日期处理指南

PostgreSQL 时间/日期处理指南 引言 PostgreSQL 是一款功能强大的开源关系型数据库系统,它提供了丰富的数据类型和功能,其中包括对时间/日期数据的支持。本文将详细介绍 PostgreSQL 中时间/日期类型的使用方法,包括数据类型、常用函数、操作和注意事项。 PostgreSQL 时间…

作者头像 李华
网站建设 2026/4/12 19:56:46

Doris资源组管理:精细化资源分配策略

Doris资源组管理:精细化资源分配的"食堂排队秘诀" 关键词:Doris资源组、精细化资源分配、查询优化、资源隔离、队列调度、Cgroup、多租户管理 摘要:当Doris作为大规模数据查询的"餐厅"时,如何让"食客"(查询)快速吃到"饭"(结果)…

作者头像 李华
网站建设 2026/4/17 8:38:54

毕业生都在用的十大降ai工具,建议收藏

家人们&#xff0c;现在学校查得是真严&#xff0c;不仅重复率&#xff0c;还得降ai率&#xff0c;学校规定必须得20%以下... 折腾了半个月&#xff0c;终于把市面上各类方法试了个遍&#xff0c;坑踩了不少&#xff0c;智商税也交了。今天这就把这份十大降AI工具合集掏心窝子…

作者头像 李华
网站建设 2026/4/18 1:59:16

fwrite与fflush作用

简单说&#xff1a; fwrite 负责“写数据”&#xff0c; fflush 负责“把缓冲里的内容真的推到文件/设备”。一、 fwrite 做什么&#xff1f;fwrite 是标准 C 里的带缓冲的文件写入函数&#xff0c;原型&#xff1a;csize_t fwrite(const void *ptr, size_t size, size_t nme…

作者头像 李华
网站建设 2026/4/18 1:57:14

《告别跨端运算偏差:游戏确定浮点数学库的核心搭建指南》

早期涉足游戏开发时,曾执着于浮点精度的极致提升,认为更高的精度就能消除所有差异,直到在一款多人协作游戏的测试中,见证过同一技能在PC端与移动端的伤害结算偏差、主机玩家与手机玩家看到的角色跳跃轨迹分歧—明明是相同的触发条件,却出现技能命中判定失效、物理道具飞行…

作者头像 李华
网站建设 2026/4/7 4:03:26

PostgreSQL ORDER BY 详解

PostgreSQL ORDER BY 详解 在数据库查询中,ORDER BY 子句是一个常用的工具,它允许用户根据一列或多列的值对结果集进行排序。本篇文章将深入探讨 PostgreSQL 中的 ORDER BY 子句,包括其基本用法、排序规则、以及如何处理不同的排序需求。 基本用法 在 PostgreSQL 中,使用…

作者头像 李华