老师codeforces1409F题,为什么初始化数组的时候必须都赋值为负无穷,赋值为0结果为啥变大了
来源:3-4 即使简单的问题,也有很多优化的思路

weixin_慕沐2087304
2021-03-22
public class four {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int K = sc.nextInt();
String s = sc.next();
String T = sc.next();
char a = T.charAt(0), b = T.charAt(1);
//dp[i][j][k]表示考虑S的前i个字符修改了j次然后存在k个a的最大子序列数
int[][][] dp = new int[N + 1][K + 1][N + 1];
//这里的赋值没想明白
for (int i = 0; i <= N; i++) {
for (int j = 0;j <= K; j++) {
for (int k = 0; k <= N; k++) {
dp[i][j][k] = Integer.MIN_VALUE;
}
}
}
dp[0][0][0] = 0;
int ans = 0;
for (int i = 1; i <= N; i++) {
for (int j = 0; j <= i && j <= K; j++) {
for (int k = 0; k <= i; k++) {
if (s.charAt(i - 1) == a && k > 0) {
dp[i][j][k] = Math.max(dp[i][j][k], dp[i - 1][j][k - 1]);
} else if (j > 0 && k > 0) {
dp[i][j][k] = Math.max(dp[i][j][k], dp[i - 1][j - 1][k - 1]);
}
if (s.charAt(i - 1) == b) {
dp[i][j][k] = Math.max(dp[i][j][k], dp[i - 1][j][k] + k);
} else if (j > 0) {
dp[i][j][k] = Math.max(dp[i][j][k], dp[i - 1][j - 1][k] + k);
}
if (s.charAt(i - 1) == a && s.charAt(i - 1) == b && k > 0) {
dp[i][j][k] = Math.max(dp[i][j][k], dp[i - 1][j][k - 1] + k - 1);
}
if (a == b && s.charAt(i - 1) != a && j > 0 && k > 0) {
dp[i][j][k] = Math.max(dp[i][j][k], dp[i - 1][j - 1][k - 1] + k - 1);
}
//不改
dp[i][j][k] = Math.max(dp[i][j][k], dp[i - 1][j][k]);
ans = Math.max(ans, dp[i][j][k]);
}
}
}
System.out.println(ans);
}
}
写回答
1回答
-
liuyubobobo
2021-03-23
抱歉,这个课程的问答区我只回答 lc 上的问题。我不可能讲了这样一个课,就对于任何一个算法平台的问题都做回答,请谅解。
对于你的问题,最简单的方式就是,使用一个小数据,实际单步跟踪去看一下,在初始化为 0 的时候,在哪一步,计算结果和预想的不一样了?为什么会出现这种情况?这和自己的想法哪里有出入?自己的想法哪里错了?而不是去生想。
这是学习算法,乃至是学习计算机任何一个领域,在编程实践中都非常重要的方式。只有通过无数次这样的实际的单步跟踪调试,才能慢慢做到只用眼睛和脑袋,就可以调试代码。
继续加油!:)
00
相似问题