为啥公司裁员大多先裁研发。。。
算法题:奇怪的打印机
dp[i][j],表示从字符串第 i 个字符到第 j 个字符所需的最少打印次数。显然,如果 i == j,也就是只有一个字符时,只需要打印一次,dp[i][j] = 1。i 个字符和第 j 个字符相同,比如 s[i] == s[j],那么我们可以把它们合并在一次打印里,这样就可以减少打印次数。否则,我们就需要分别打印它们。if (s.charAt(i) == s.charAt(j)) {dp[i][j] = dp[i][j - 1];} else {dp[i][j] = Math.min(dp[i][k] + dp[k + 1][j]);}
k 是一个中间位置,用来尝试把字符串分成两部分,分别计算打印次数。这个“分治”的思路在动态规划里很常见。public class StrangePrinter {public int strangePrinter(String s) {int n = s.length();if (n == 0) return 0;int[][] dp = new int[n][n];// 初始化 dp 数组for (int i = 0; i < n; i++) {dp[i][i] = 1; // 单字符只需打印一次}// 开始填表,区间长度从 2 开始for (int len = 2; len <= n; len++) {for (int i = 0; i <= n - len; i++) {int j = i + len - 1;dp[i][j] = dp[i][j - 1] + 1; // 最坏情况,每个字符单独打印for (int k = i; k < j; k++) {if (s.charAt(k) == s.charAt(j)) {dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k + 1][j - 1]);}}}}return dp[0][n - 1];}public static void main(String[] args) {StrangePrinter printer = new StrangePrinter();String test = "aaabbb";System.out.println("最少打印次数是:" + printer.strangePrinter(test)); // 输出 2}}
1. 初始化:
dp[i][i] = 1,因为单个字符只需要打印一次。2. 状态转移:如果
s[i] == s[j],可以减少一次打印;否则需要尝试分割区间。3. 遍历顺序:动态规划一般是先处理小区间,再逐步扩展到大区间。
"aaabbb"。打印机可以先打印 "aaa",然后打印 "bbb",总共两次。如果是 "aba",就需要先打印 "a",再打印 "b",最后再打印 "a",总共三次。最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
-END-
以上,就是今天的分享了,看完文章记得右下角点赞,也欢迎在评论区写下你的留言。