题解 | [CQOI2007]涂色PAINT

[CQOI2007]涂色PAINT

https://www.nowcoder.com/practice/512619bee5874e85bd2812a0c9066125


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String line = sc.nextLine();
        char[] chars = line.toCharArray();
        run(chars);
    }

    public static void run(char[] s) {
        int n = s.length;
        int[][] dp = new int[n + 1][n + 1];
        // 将所有相同位置为1
        for (int i = 0; i < n; i ++) {
            dp[i][i] = 1;
        }
        // 这是一个把涂色过程“逆向”过来的区间DP问题
        // 开始根据距离大小遍历。确定 右边界 = 左边界 + 距离
        for (int i = 1; i < n; i ++) {
            // 左边界值
            for (int j = 0; j + i < n; j ++) {
                int l = j, r = j + i;

                if (s[l] == s[r]) {
                    // 如果左右边界相等,选左或右边界作为目标颜色
                    // 比如GBG中选择GB(选左)或者BG(选右),然后都能涂色为GG,这样就能得到一个GGG。所以本质上选左和选右都可以
                    dp[l][r] = dp[l + 1][r];//选右
                } else {
                    // 如果不相等,则从中间遍历
                    for (int k = l; k <= r; k ++) {
                        // 如果为 dp[l][r] != 0,说明已经计算过,取最小值
                        if (dp[l][r] != 0) {
                            dp[l][r] = Math.min(dp[l][r], dp[l][k] + dp[k + 1][r]);
                        } else {
                            dp[l][r] = dp[l][k] + dp[k + 1][r];
                        }


                    }
                }
            }
        }
        System.out.println(dp[0][n - 1]);
    }


}


全部评论

相关推荐

03-05 14:55
已编辑
门头沟学院 Java
Jhin4ever:别去,杂活太多,今天让你部署一下模型,明天让你写一下LLM工作流,后天要你研究一下Agent,想微调模型都难
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务