问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
- 小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。
代码解析
1. 初始化
java
int[] a = new int[100001];
这行代码初始化了一个长度为100001的数组a,用于存储每只猫得到的鱼干数量。
2. 动态规划算法
java
public static int solution(int n, List<Integer> cats_levels) {
Arrays.fill(a, 0);
int res = 0;
for (int i = 0; i < n; i++) {
int t = 1;
if (a[i] == 0) {
if (i != 0 && cats_levels.get(i) > cats_levels.get(i - 1)) {
t = a[i - 1] + 1;
}
a[i] = Math.max(dfs(i, n, cats_levels), t);
}
res += a[i];
}
return res;
}
这个函数是动态规划算法的核心。对于每只猫,我们考虑以下情况:
- 如果这只猫之前没有被分配过鱼干(
a[i] == 0),我们检查它是否比前一只猫等级高。如果是,它至少需要比前一只猫多一斤鱼干(t = a[i - 1] + 1)。 - 我们使用
dfs函数来处理当前猫和它后面的猫,确保等级高的猫得到的鱼干比等级低的猫多。 - 最后,我们将每只猫得到的鱼干数量累加到结果
res中。
3. 深度优先搜索(DFS)
java
public static int dfs(int x, int n, List<Integer> cats_levels) {
if (x + 1 < n && cats_levels.get(x + 1) < cats_levels.get(x)) {
return a[x] = dfs(x + 1, n, cats_levels) + 1;
} else return a[x] = 1;
}
dfs函数是一个递归函数,用于确保等级高的猫得到的鱼干比等级低的猫多。如果当前猫的下一只猫等级更低,那么当前猫至少需要比下一只猫多一斤鱼干。
4. 主函数测试
java
public static void main(String[] args) {
List<Integer> catsLevels1 = new ArrayList<>();
catsLevels1.add(1);
catsLevels1.add(2);
catsLevels1.add(2);
List<Integer> catsLevels2 = new ArrayList<>();
catsLevels2.add(6);
catsLevels2.add(5);
catsLevels2.add(4);
catsLevels2.add(3);
catsLevels2.add(2);
catsLevels2.add(16);
List<Integer> catsLevels3 = new ArrayList<>();
catsLevels3.add(1);
catsLevels3.add(2);
catsLevels3.add(2);
catsLevels3.add(3);
catsLevels3.add(3);
catsLevels3.add(20);
catsLevels3.add(1);
catsLevels3.add(2);
catsLevels3.add(3);
catsLevels3.add(3);
catsLevels3.add(2);
catsLevels3.add(1);
catsLevels3.add(5);
catsLevels3.add(6);
catsLevels3.add(6);
catsLevels3.add(5);
catsLevels3.add(5);
catsLevels3.add(7);
catsLevels3.add(7);
catsLevels3.add(4);
System.out.println(solution(3, catsLevels1) == 4);
System.out.println(solution(6, catsLevels2) == 17);
System.out.println(solution(20, catsLevels3) == 35);
}
在main函数中,我们提供了几个测试用例来验证算法的正确性。这些测试用例覆盖了不同的输入情况,包括数字3、6和20。
注意事项
- 在处理猫的等级时,确保遵守规则:等级高的猫应该得到更多的鱼干。
- 在实际应用中,可能需要根据具体情况调整算法,以适应不同的需求和约束条件。
通过这个练习,我们不仅学习了如何使用动态规划和深度优先搜索来解决问题,还了解了如何编写健壮的代码来处理不同的输入情况。这对于任何涉及数据处理的编程任务都是一个重要的技能。