当前位置: 首页 > news >正文

拓扑dp|博弈|正难则反

 

lc1705 

pq

 

tle...

class Solution {
public:
int eatenApples(vector<int>& apples, vector<int>& days) {
// 最小堆,存储苹果的腐烂日期
priority_queue<int, vector<int>, greater<int>> q;
int n = apples.size();
int ret = 0;
int i = 0;
while (i < n || !q.empty())

{
// 处理第i天新长的苹果
if (i < n && apples[i] > 0) {
int rotDay = i + days[i];
for (int j = 0; j < apples[i]; ++j) {
q.push(rotDay);
}
}


// 移除已经腐烂的苹果
while (!q.empty() && q.top() <= i) {
q.pop();
}


// 吃一个苹果
if (!q.empty()) {

q.pop();
ret++;
}
i++;  //下一天
}
return ret;
}
};

 

 

lc913

倒推式dp

 

从鼠进洞(鼠赢)、猫鼠同点(猫赢)等明确结局出发,反向推导初始状态(鼠在1、猫在2、鼠先动)下的胜负

 

 

 

class Solution {

public:
int catMouseGame(vector<vector<int>>& g) {
const int HOLE = 0;
int n = g.size();
vector deg(n, vector<array<int, 2>>(n));
for (int i = 0; i < n; i++) {
for (int j = 1; j < n; j++) {
deg[i][j][0] = g[i].size();
deg[i][j][1] = g[j].size();
}
  // 对于猫来说,所有连到洞的边都不能走
for (int j : g[HOLE]) {
deg[i][j][1]--;
}
}

 

        vector winner(n, vector<array<int, 2>>(n));
queue<tuple<int, int, int>> q;
for (int i = 1; i < n; i++) {
winner[HOLE][i][1] = 1; // 鼠到达洞中(此时轮到猫移动),鼠获胜
winner[i][i][0] = winner[i][i][1] = 2; // 猫和鼠出现在同一个节点,无论轮到谁移动,都是猫获胜
q.emplace(HOLE, i, 1); // 从终点开始倒推
q.emplace(i, i, 0);
q.emplace(i, i, 1);

}

 

        // 获取 (mouse, cat, turn) 的上个状态(值尚未确定)
auto get_pre_states = [&](int mouse, int cat, int turn)

{
vector<pair<int, int>> pre_states;
if (turn == 0) { // 当前轮到鼠移动
for (int pre_cat : g[cat]) { // 上一轮猫的位置
if (pre_cat != HOLE && winner[mouse][pre_cat][1] == 0) { // 猫无法移动到洞中
pre_states.emplace_back(mouse, pre_cat);
}
}
} else { // 当前轮到猫移动
for (int pre_mouse : g[mouse]) { // 上一轮鼠的位置
if (winner[pre_mouse][cat][0] == 0) {
pre_states.emplace_back(pre_mouse, cat);
}
}
}
return pre_states;
};

 

        while (!q.empty())

    {
auto [mouse, cat, turn] = q.front(); q.pop();


int win = winner[mouse][cat][turn]; // 最终谁赢了


int pre_turn = turn ^ 1;


for (auto [pre_mouse, pre_cat] : get_pre_states(mouse, cat, turn))

        {
// 情况一:如果上一回合鼠从 pre 移动到 cur,最终鼠赢,那么标记 pre 状态的 winner = 鼠
// 情况二:如果上一回合猫从 pre 移动到 cur,最终猫赢,那么标记 pre 状态的 winner = 猫
// 情况三:如果上一回合鼠从 pre 移动到 cur,最终猫赢,那么待定,直到我们发现从 pre 出发能到达的状态都是猫赢,那么标记 pre 状态的 winner = 猫
// 情况四:如果上一回合猫从 pre 移动到 cur,最终鼠赢,那么待定,直到我们发现从 pre 出发能到达的状态都是鼠赢,那么标记 pre 状态的 winner = 鼠
if (pre_turn == win - 1 || --deg[pre_mouse][pre_cat][pre_turn] == 0) {
winner[pre_mouse][pre_cat][pre_turn] = win;

q.emplace(pre_mouse, pre_cat, pre_turn); // 继续倒推
}
}
}

        // 鼠在节点 1,猫在节点 2,当前轮到鼠移动
return winner[1][2][0]; // 返回最终谁赢了(或者平局)
}
};

 


文章转载自:

http://xAE6eA8U.wrkcw.cn
http://2l9VwA6J.wrkcw.cn
http://j3hHKyPO.wrkcw.cn
http://5ouyzigw.wrkcw.cn
http://8rnmQQaD.wrkcw.cn
http://egTFLHNB.wrkcw.cn
http://0Nl9Rvnp.wrkcw.cn
http://clHDZeI1.wrkcw.cn
http://G6fPvcat.wrkcw.cn
http://bWx4fk4V.wrkcw.cn
http://Jv8ToD5A.wrkcw.cn
http://1CD0WmMg.wrkcw.cn
http://LwU3KaiY.wrkcw.cn
http://hLydElrg.wrkcw.cn
http://LZj1TTKa.wrkcw.cn
http://cucu5trj.wrkcw.cn
http://tS6Aj0HO.wrkcw.cn
http://UZCIcUfb.wrkcw.cn
http://I5zkIGTm.wrkcw.cn
http://KzXtAXDZ.wrkcw.cn
http://GiQQTDVO.wrkcw.cn
http://l1UJEhav.wrkcw.cn
http://8JaLCIlH.wrkcw.cn
http://w28LRGej.wrkcw.cn
http://1ePbhgXc.wrkcw.cn
http://m815uXt1.wrkcw.cn
http://sRsXjWQQ.wrkcw.cn
http://mVRR0fle.wrkcw.cn
http://W3NmIfdQ.wrkcw.cn
http://Mx5Yaj5M.wrkcw.cn
http://www.dtcms.com/a/384898.html

相关文章:

  • linux时间管理
  • 第2章 语言模型:自然语言处理的基石
  • 汽车电子电气架构 --- 新趋势下的挑战与技术
  • 地铁站电子钟:NTP实时校准时间
  • 【数据集】2025年国家自然科学基金立项名单(经管类)
  • Elastic APM 2025 新特性:Tail-based Sampling 和 GenAI 优化
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘sklearn’ 问题
  • 《二战系统分析师》第五章总结
  • 机器学习中的距离总结
  • MongoDB集群开发完全指南:从原理到实践
  • apache phoenix sql 命令大全详解
  • python 读取大文件优化示例
  • 布草洗涤厂设备租赁押金原路退回系统—东方仙盟
  • JAVASCRIPT 前端数据库-V9--仙盟数据库架构-—仙盟创梦IDE
  • 开源AI大模型、AI智能名片与S2B2C商城小程序:从“不出现=不存在”到“精准存在”的数字化转型路径
  • LNMP环境搭建:高效Web服务器指南
  • ACP(三):让大模型能够回答私域知识问题
  • Angle-Based SLAM on 5G mmWave Systems: Design, Implementation, and Measurement
  • 京瓷1025打印机打印有底灰简单处理
  • UE5 播放关卡时,将渲染画面的相机转变为关卡序列中的相机
  • JavaSE 异常
  • Unity Excel数据导入工具
  • 镭神C16在Ubuntu下的连接和驱动安装教程
  • 如何在qt中配置libssh
  • 使用 Spring Boot 3.x 集成 Kafka 并在 Kubernetes 上部署的全流程指南
  • 记录本地安装anaconda pytorch python
  • 关于机器学习中的各种“学习”
  • Parlant框架深度技术解析:革命性AI代理行为建模引擎
  • 疯狂星期四文案网第68天运营日记
  • RabbitMQ 消息路由与交换机机制