洛谷p1514引水入城,用记忆化搜索用C++写,不要用太难的语法写
时间: 2024-09-21 07:12:08 浏览: 67
题目“引水入城”(P1514 - Water Pouring)是一个经典的动态规划问题,通常通过使用记忆化搜索(也称为自底向上的填充法或回溯法)解决。这个问题是LeetCode中的一个变体,它描述了将水源A的水平面高度调整到B的高度,并通过一系列的转移操作完成,每个操作可以将一定量的水从一个桶转移到另一个桶。
以下是一个简单的C++实现,使用二维数组来存储已计算的结果并避免重复计算:
```cpp
#include <vector>
using namespace std;
int minTransfer(int x, int y, vector<int>& v) {
if (x <= 0 || y <= 0) return abs(x - y); // 如果其中一个桶为空,直接返回差值
// 定义一个大小为v.size() + 1的数组dp,用于记录从x到y最小水量
vector<int> dp(v.size() + 1, INT_MAX);
dp[0] = 0; // 当两个桶都空的时候,水量为0
// 用for循环遍历所有可能的水量值,尝试填满y桶
for (int i = 1; i <= x; ++i) {
dp[i] = min(dp[i], min(dp[i - v[i]], min(i, y)));
}
return dp[x]; // 最终的答案就是从x桶中转移出的最少水量
}
// 测试函数
int main() {
int A, B;
cin >> A >> B;
vector<int> v(A);
for (int& a : v) cin >> a;
cout << minTransfer(A, B, v) << endl;
return 0;
}
```
在这个代码中,`minTransfer`函数接受三个参数:当前桶A的高度、目标桶B的高度以及水位变化数组v。通过递归地查找最小转移次数,直到满足条件。
阅读全文