线性动态规划专讲

简介: 线性动态规划专讲

线性规划概念

动态规划的主要特点是状态的推导是按照问题规模 i ii 从小到大依次推过去的(或者从后往前一直推过来的,比如「石子游戏」、「2140.解决智力问题」就是从后往前推的),较大规模的问题的解依赖较小规模的问题的解。

通常做此类问题步骤如下:

image.png

LeetCode 877. 石子游戏

class Solution {
    public boolean stoneGame(int[] piles) {
        int n = piles.length;
        long[][] dp = new long[n + 1][n + 1];
        // dp[i][j]代表从区间[i,j]之间获得的最多分数
        // dp[i][j] = Math.max(piles[i] + dp[i + 1][j], dp[i][j - 1] + plies[j])
        // dp[i][i] = 0
        // dp[0][n - 1] > 0 ? true : false;
        for (int i = 0 ; i < n; i++) {
            dp[i][i] = 0;
        }
        for (int i = n - 1; i >= 0; i--) {
            for (int j = i + 1; j < n; j++) {
                dp[i][j] = Math.max(piles[i] + dp[i + 1][j], dp[i][j - 1] + piles[j]);
            }
        }
        return dp[0][n - 1] > 0 ? true : false;
    }
}

LeetCode 2140. 解决智力问题

class Solution {
    public long mostPoints(int[][] q) { 
        int n = q.length;
        // dp[i]的含义是从下标i~n-1获取的最大分数值
        // dp[i] = Math.max(dp[Math.min(n, q[i][1])] + q[i][0], dp[i])
        long[] dp = new long[n + 1];
        for (int i = n - 1; i >= 0; i--) {
            dp[i] = Math.max(dp[Math.min(n, i + q[i][1] + 1)] + q[i][0], dp[i + 1]);
        }
        return dp[0];
    }
}

LeetCode 72. 编辑距离

class Solution {
    public int minDistance(String word1, String word2) {
        int n = word1.length();
        int m = word2.length();
        // 含义:dp[i][j]代表Word1从下标0~i和word2从下标0~j所使用的的最少操作次数
        // 状态转移方程:dp[i][j] = Math.min(dp[i  -1][j] + 1,Math.min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + (word1.charAt(i - 1) != word2.charAt(j - 1) ? 1 : 0)));
        int[][] dp = new int[n + 1][m + 1];
        if (n * m == 0) {
            return n + m;
        }
        for (int i = 0; i <= n; i++) {
            dp[i][0] = i;
        }
        for (int j = 0 ; j <= m ; j++) {
            dp[0][j] = j;
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                int left = dp[i  -1][j] + 1;
                int down = dp[i][j - 1] + 1;
                int left_down = dp[i - 1][j - 1];
                if (word1.charAt(i - 1) != word2.charAt(j - 1)) {
                    left_down++;
                }
                dp[i][j] = Math.min(left_down, Math.min(left, down));
            }
        }
        return dp[n][m];
    }
}


相关文章
|
网络协议 数据安全/隐私保护 网络架构
手把手教你轻松获取局域网络设备
手把手教你轻松获取局域网络设备
606 0
手把手教你轻松获取局域网络设备
|
3天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
10489 48
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
9天前
|
人工智能 JavaScript API
解放双手!OpenClaw Agent Browser全攻略(阿里云+本地部署+免费API+网页自动化场景落地)
“让AI聊聊天、写代码不难,难的是让它自己打开网页、填表单、查数据”——2026年,无数OpenClaw用户被这个痛点困扰。参考文章直击核心:当AI只能“纸上谈兵”,无法实际操控浏览器,就永远成不了真正的“数字员工”。而Agent Browser技能的出现,彻底打破了这一壁垒——它给OpenClaw装上“上网的手和眼睛”,让AI能像真人一样打开网页、点击按钮、填写表单、提取数据,24小时不间断完成网页自动化任务。
2280 5
|
23天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
23760 121
|
3天前
|
人工智能 IDE API
2026年国内 Codex 安装教程和使用教程:GPT-5.4 完整指南
Codex已进化为AI编程智能体,不仅能补全代码,更能理解项目、自动重构、执行任务。本文详解国内安装、GPT-5.4接入、cc-switch中转配置及实战开发流程,助你从零掌握“描述需求→AI实现”的新一代工程范式。(239字)
1780 126

热门文章

最新文章