老师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 的时候,在哪一步,计算结果和预想的不一样了?为什么会出现这种情况?这和自己的想法哪里有出入?自己的想法哪里错了?而不是去生想。


这是学习算法,乃至是学习计算机任何一个领域,在编程实践中都非常重要的方式。只有通过无数次这样的实际的单步跟踪调试,才能慢慢做到只用眼睛和脑袋,就可以调试代码。


继续加油!:)

0
0

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7435 学习 · 1159 问题

查看课程