JAVA编程题-租用游艇
2023-12-20 08:51:25
问题描述:
假设某条河有N个游艇出租站1、2、3...N,游客可以在出租站租用游艇,并在下游任何一个出租站归还游艇,出租站i和出租站j之间的租金为R(i,j)其中1<=i<j<=N,试设计一个算法,计算从出租站1到N所需要最少的租金。
要求:
出租站输入
出租站个数不要太小就行
租金输入
自动输出结果
预期效果
上代码
public class BoatRentalProblem {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入出租站的个数:");
int N = scanner.nextInt();
int[][] R = new int[N][N];
System.out.println("请输入完整的租金矩阵(每行输入对应租金矩阵的一行,每行之间用空格隔开):");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
R[i][j] = scanner.nextInt();
}
}
scanner.close();
int minRent = calculateMinRent(R, N);
System.out.println("从出租站1到出租站" + N + "所需的最少租金为:" + minRent);
}
public static int calculateMinRent(int[][] R, int N) {
int[] dp = new int[N + 1];
for (int i = 2; i <= N; i++) {
dp[i] = R[0][i - 1]; // 初始化dp数组
for (int j = 1; j < i; j++) {
dp[i] = Math.min(dp[i], dp[j] + R[j - 1][i - 1]); // 更新dp数组
}
}
return dp[N];
}
}
最后,代码优化
代码有一些方面可以进行优化以提高效率和可读性。
-
输入验证:
- 在读取出租站数量和租金矩阵之前,可以添加一些输入验证来确保输入的有效性。例如,可以检查出租站数量是否大于0,以及租金矩阵是否是一个方阵(即行数和列数相等)。
-
代码注释:
- 虽然代码有一些基本的注释,但添加更多详细的注释可以帮助其他开发者更容易地理解代码的逻辑和目的。
-
变量命名:
- 使用更具描述性的变量名可以使代码更容易理解。例如,可以将?
N
?重命名为?numStations
,将?R
?重命名为?rentMatrix
?等。
- 使用更具描述性的变量名可以使代码更容易理解。例如,可以将?
-
动态规划数组初始化:
- 在?
calculateMinRent
?方法中,dp
?数组被初始化为?new int[N + 1]
。由于Java中数组默认初始化为0,因此显式地将?dp[1]
?设置为0是不必要的。
- 在?
-
循环优化:
- 在内层循环中,可以使用一个变量来存储当前的最小租金,这样可以避免在每次迭代时都访问数组。这可能对性能有轻微的提升。
-
异常处理:
- 可以添加异常处理来捕获可能的输入错误,例如当用户输入的不是整数时。
-
输出格式:
- 可以考虑改进输出格式,使其对用户更加友好。例如,可以添加一些额外的文本或换行符来提高可读性。
-
代码重构:
- 可以将输入和输出部分与逻辑部分分开,这样可以使代码结构更清晰,也更容易进行单元测试。
-
使用Java 8+特性:
- 如果使用的是Java 8或更高版本,可以考虑使用流(Streams)或Lambda表达式来简化代码。
-
关闭Scanner:
- 你已经正确地在代码末尾关闭了Scanner,这是一个好习惯,可以避免资源泄露。
文章来源:https://blog.csdn.net/qq_34417433/article/details/135083101
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!