• 蓝桥杯备赛第五篇(动态规划)


    1.数位dp

    1. public class Main {
    2. static long[] limit;
    3. static int length;
    4. static long[][] dp;
    5. public static long dfs(int pos, int pre, boolean flag, boolean lead) {
    6. if (pos == length) return 1;
    7. if (!flag && !lead && dp[pos][pre] != -1) return dp[pos][pre];
    8. long max = (flag ? limit[pos] : 进制数);
    9. long sum = 0;
    10. for (int i = 0; i <= max; i++) {
    11. if (条件) {
    12. sum += dfs(pos + 1, i, flag && i == limit[pos], lead && i == 0);
    13. }
    14. }
    15. if (!flag && !lead) dp[pos][pre] = sum;
    16. return sum;
    17. }
    18. public static long solve(long num) {
    19. if (num == 0) return 1;
    20. length = ("" + num).length();
    21. limit = new long[length];
    22. dp = new long[length][10];
    23. for (int i = 0; i < length; i++) {
    24. Arrays.fill(dp[i], -1);
    25. }
    26. for (int i = length - 1; i >= 0; i--) {
    27. limit[i] = num % 进制数;
    28. num /= 进制数;
    29. }
    30. return dfs(0, 0, true, true);
    31. }
    32. public static void main(String[] args) {
    33. Scanner scanner = new Scanner(System.in);
    34. int a = scanner.nextInt();
    35. int b = scanner.nextInt();
    36. System.out.println(solve(b) - solve(a - 1));
    37. }
    38. }

    2.状态压缩dp

    这一部分没有统一的算法模板,只有对二进制操作熟悉之后才能做好这类题,所以我在此总结几个操作。

    进行标记:i | (1< 判断是否被标记: (i & (1< 判断是否包含:a | b == b
    当前行选的元素不能相邻:now & (now >> 1) == 0
    当前行与上一行的选择上下也不能相邻:pre & now == 0
    注意:添加状态用 | ,删除状态用 ^,判断状态用 &

    3.最长公共子序列

    1. public class Main {
    2. public static void main(String[] args) {
    3. char[] str1 = "abcdefgh".toCharArray();
    4. char[] str2 = "acjlfabhh".toCharArray();
    5. int[][] dp = new int[str1.length + 1][str2.length + 1];
    6. for (int i = 1; i <= str1.length; i++) {
    7. for (int j = 1; j <= str2.length; j++) {
    8. if (str1[i - 1] == str2[j - 1]) {
    9. dp[i][j] = dp[i - 1][j - 1] + 1;
    10. } else {
    11. dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
    12. }
    13. }
    14. }
    15. System.out.println(dp[str1.length][str2.length]);
    16. }
    17. }

    4.最大连续子序列和

    1. public class Main {
    2. public static void main(String[] args) {
    3. int[] arr = new int[]{-2, 11, -4, 13, -5, -2};
    4. int[] dp = new int[arr.length];
    5. dp[0] = arr[0];
    6. int max = arr[0];
    7. for (int i = 1; i < arr.length; i++) {
    8. dp[i] = Math.max(dp[i - 1] + arr[i], arr[i]);
    9. max = Math.max(max, dp[i]);
    10. }
    11. System.out.println(max);
    12. }
    13. }

    5.最长上升子序列

    1. public class Main {
    2. public static void main(String[] args) {
    3. int[] arr = new int[]{2, 1, 5, 3, 6, 4, 6, 3};
    4. int[] dp = new int[arr.length];
    5. dp[0] = 1;
    6. int max = dp[0];
    7. for (int i = 1; i < arr.length; i++) {
    8. for (int j = i - 1; j >= 0; j--) {
    9. if (arr[i] > arr[j]) {
    10. dp[i] = Math.max(dp[i], dp[j] + 1);
    11. }
    12. max = Math.max(max, dp[i]);
    13. }
    14. }
    15. System.out.println(max);
    16. }
    17. }

  • 相关阅读:
    AT89S51编辑和烧录软件过程
    神经网络深度学习(四)特征处理
    差分约束做法
    【图像分割】基于萤火虫算法实现图像聚类分割附matlab代码
    证券行业超融合架构方案设计
    C# Onnx 特征匹配 DeDoDe 检测,不描述---描述,不检测
    5、WebApi 在腾讯云服务器中部署初试
    idea请问这两处标红是哪错了
    <数据集>Udacity交通目标识别数据集<目标检测>
    从零开始探索C语言(八)----指针
  • 原文地址:https://blog.csdn.net/m0_73473352/article/details/136434130