牛客题解 | 倒水
1.牛客题解 | 5-血型遗传检测2.牛客题解 | 61-递归和动态规划-汉诺塔II3.牛客题解 | Anniversary4.牛客题解 | BST判定5.牛客题解 | CCNumber6.牛客题解 | CIDR去重7.牛客题解 | DNA序列8.牛客题解 | D塔29.牛客题解 | Fibonacci数列10.牛客题解 | K 的倍数11.牛客题解 | Kolakoski 序列12.牛客题解 | LRU Cache13.牛客题解 | LUCKY STRING14.牛客题解 | N-GCD15.牛客题解 | Numeric Keypad16.牛客题解 | Shopee的办公室(二)17.牛客题解 | Spring Outing18.牛客题解 | UTF-8 编码验证19.牛客题解 | Unix路径简化20.牛客题解 | bit count21.牛客题解 | bit位数22.牛客题解 | filename extension23.牛客题解 | geohash编码24.牛客题解 | ipv4地址白名单25.牛客题解 | ipv4地址白名单_126.牛客题解 | k倍多重正整数集合27.牛客题解 | n个数里出现次数大于等于n除以2的数28.牛客题解 | n个数里最小的k个29.牛客题解 | water30.牛客题解 | xor31.牛客题解 | ん...红茶?32.牛客题解 | 一封奇怪的信33.牛客题解 | 一组带数字编号的球,其中有两个编号只出现了一次,把它们找出来34.牛客题解 | 万万没想到之抓捕孔连顺35.牛客题解 | 万万没想到之聪明的编辑36.牛客题解 | 上台阶37.牛客题解 | 上高楼38.牛客题解 | 下厨房39.牛客题解 | 不想出差的HR40.牛客题解 | 不要二41.牛客题解 | 丢失的三个数42.牛客题解 | 两两配对差值最小43.牛客题解 | 两个子串44.牛客题解 | 两个整数二进制位不同个数45.牛客题解 | 两种排序方法46.牛客题解 | 中位数47.牛客题解 | 中缀表达式转后缀表达式48.牛客题解 | 丰收49.牛客题解 | 串的模式匹配50.牛客题解 | 之字形打印矩阵51.牛客题解 | 乔乔的包52.牛客题解 | 乘坐公交53.牛客题解 | 乘方取模54.牛客题解 | 买房55.牛客题解 | 买橘子56.牛客题解 | 买苹果57.牛客题解 | 买面包58.牛客题解 | 争吵59.牛客题解 | 二分图判定60.牛客题解 | 二分图判定_161.牛客题解 | 二分查找62.牛客题解 | 二叉搜索树判定63.牛客题解 | 二叉树的序列化64.牛客题解 | 二维数组打印65.牛客题解 | 二进制中有多少个166.牛客题解 | 交叉线67.牛客题解 | 交换查询68.牛客题解 | 交错01串69.牛客题解 | 交错序列70.牛客题解 | 代价71.牛客题解 | 任务调度72.牛客题解 | 优雅的点73.牛客题解 | 会话列表74.牛客题解 | 会话列表_175.牛客题解 | 伪正则表达式76.牛客题解 | 俄罗斯方块77.牛客题解 | 保卫方案78.牛客题解 | 保留最大的数79.牛客题解 | 信用卡推荐客户列表
80.牛客题解 | 倒水
81.牛客题解 | 倒着输出整数82.牛客题解 | 倒置字符串83.牛客题解 | 公交车84.牛客题解 | 公平划分85.牛客题解 | 公约数86.牛客题解 | 六一儿童节87.牛客题解 | 共享单车88.牛客题解 | 关灯游戏89.牛客题解 | 冒泡排序90.牛客题解 | 写一段程序判断IP字符串是否属于内网IP题目
解题思路
这是一个递归/动态规划问题,需要计算将 升水倒入 个相同容器的不同倒法数量:
- 每个容器容量足够大
- 允许容器为空
- 相同的倒水数量序列视为同一种倒法
解题思路:
- 当 或 ,或 时,只有一种倒法
- 对于其他情况,可以分为 个容器装水的情况
- 使用动态规划避免重复计算
代码
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int countWays(int m, int n) {
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// 初始化边界条件
for (int i = 0; i <= m; i++) {
dp[i][1] = 1; // 只有一个容器
}
for (int j = 1; j <= n; j++) {
dp[0][j] = 1; // 没有水
dp[1][j] = 1; // 只有1升水
}
// 动态规划
for (int i = 2; i <= m; i++) {
for (int j = 2; j <= n; j++) {
int temp = min(i, j);
for (int k = 1; k <= temp; k++) {
if (k == 1) {
dp[i][j] += dp[i][k];
} else {
dp[i][j] += dp[i-k][k];
}
}
}
}
return dp[m][n];
}
};
int main() {
int x;
cin >> x;
Solution sol;
while (x--) {
int m, n;
cin >> m >> n;
cout << sol.countWays(m, n) << endl;
}
return 0;
}
import java.util.Scanner;
public class Main {
public static int countWays(int m, int n) {
int[][] dp = new int[m + 1][n + 1];
// 初始化边界条件
for (int i = 0; i <= m; i++) {
dp[i][1] = 1; // 只有一个容器
}
for (int j = 1; j <= n; j++) {
dp[0][j] = 1; // 没有水
dp[1][j] = 1; // 只有1升水
}
// 动态规划
for (int i = 2; i <= m; i++) {
for (int j = 2; j <= n; j++) {
int temp = Math.min(i, j);
for (int k = 1; k <= temp; k++) {
if (k == 1) {
dp[i][j] += dp[i][k];
} else {
dp[i][j] += dp[i-k][k];
}
}
}
}
return dp[m][n];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
while (x-- > 0) {
int m = sc.nextInt();
int n = sc.nextInt();
System.out.println(countWays(m, n));
}
sc.close();
}
}
def count_ways(m: int, n: int) -> int:
dp = [[0] * (n + 1) for _ in range(m + 1)]
# 初始化边界条件
for i in range(m + 1):
dp[i][1] = 1 # 只有一个容器
for j in range(1, n + 1):
dp[0][j] = 1 # 没有水
dp[1][j] = 1 # 只有1升水
# 动态规划
for i in range(2, m + 1):
for j in range(2, n + 1):
temp = min(i, j)
for k in range(1, temp + 1):
if k == 1:
dp[i][j] += dp[i][k]
else:
dp[i][j] += dp[i-k][k]
return dp[m][n]
# 读取输入
x = int(input())
for _ in range(x):
m, n = map(int, input().split())
print(count_ways(m, n))
算法及复杂度
- 算法:动态规划
- 时间复杂度:,其中 是水的升数, 是容器数
- 空间复杂度:,用于存储 数组
合集:
牛客笔试大厂真题题解1
分类:
牛客笔试大厂真题题解1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)