一路走好

本文表达了作者对其毕业后首位导师的感激之情。导师不仅传授了专业技能,还帮助解决了毕业生常见的问题,为作者的职业生涯打下了坚实的基础。
你是我毕业后的第一位恩师。惊闻你将在两星期后离职去异地工作,我感到十分惊讶。还记得一年多以前,面试我的是你,我得到了人生第一份工作。去年三月份开始实习,你把我调到了你的项目组,然后我开始师从于你。也许是因为母校情节,你让我感到非常亲切。实习的两个月中,在你细心的辅导下,我学会了很多东西,并且开始慢慢适应新的生活。在学校待了两个月后开始了我的正式职业生涯,七月初到公司报道。作为团队的系统工程师,你组织了一系列的产品开发培训。我对项目的了解从最初的零,慢慢地开始熟悉,一直到现在的透彻,都是你培训的效果。半年以来,你不仅帮助我提升了工作能力,还帮助解决了应届毕业生在刚开始工作时都将遇到的许许多多问题。
非常感谢你半年多对我的照顾!掌,一路走好,希望你在今后的路上一帆风顺……
这是一个经典的**递归 + 记忆化搜索**或**动态规划**问题,涉及到酒的数量、店和花的次数限制,并且要求最后一次是遇到花并且刚好喝完酒。 --- ### 问题分析: 李白初始有酒 2 斗。 他一共遇到店 N 次、花 M 次。 规则如下: - 遇到店:酒量翻倍; - 遇到花:喝掉一斗; - 最后一次必须是花,而且此时酒为 0; - 酒为 0 时不能再遇到花(否则非法); 我们需要找出所有满足条件的“店”和“花”的排列顺序数。 --- ### 解决方案:记忆化搜索(DFS+Memo) 我们使用 DFS 来模拟每一步选择“店”或者“花”,并用 memo 进行剪枝优化。 --- ### C++代码实现如下: ```cpp #include <iostream> #include <vector> #include <map> using namespace std; const int MOD = 1e9 + 7; // memo[store_left][flower_left][wine] = count map<int, map<int, map<int, long long>>> memo; // store_left: 剩余店的次数 // flower_left: 剩余花的次数 // wine: 当前酒的数量 long long dfs(int store_left, int flower_left, int wine) { // 如果酒为0,不能再遇到花 if (wine == 0 && flower_left > 0) return 0; // 最后一次必须是花,且酒喝光 if (flower_left == 1 && store_left == 0 && wine == 1) return 1; // 终止条件 if (store_left == 0 && flower_left == 0) { return (wine == 0) ? 1 : 0; } // 查看是否已经计算过 if (memo.count(store_left) && memo[store_left].count(flower_left) && memo[store_left][flower_left].count(wine)) return memo[store_left][flower_left][wine]; long long res = 0; // 选择店 if (store_left > 0) { res += dfs(store_left - 1, flower_left, wine * 2) % MOD; } // 选择花 if (flower_left > 0 && wine >= 1) { res += dfs(store_left, flower_left - 1, wine - 1) % MOD; } return memo[store_left][flower_left][wine] = res % MOD; } int main() { int N, M; cin >> N >> M; cout << dfs(N, M, 2) % MOD << endl; return 0; } ``` --- ### 解释: 1. **dfs函数参数含义**: - `store_left`: 剩余可选店的次数; - `flower_left`: 剩余可选花的次数; - `wine`: 当前壶中酒的数量; 2. **边界条件处理**: - 如果酒为 0 但还有花未使用,直接返回 0(无法合法完成); - 最后一次必须是花,且酒为 1 才能喝完; - 全部走完时,判断是否酒为 0; 3. **记忆化缓存**: - 使用嵌套的 `map` 结构缓存中间结果,避免重复计算; 4. **时间复杂度优化**: - 使用 memoization 将指数级复杂度降低到多项式级别; - 实际运行速度较快,适用于较大输入范围; ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值