动态规划题目:单词拆分/三角形最小路径和 - leetcode

 动态规划思想 / 步骤 :

  1.         先将 当前要求  总结成一个 精炼的 小问题 ,
  2.         然后 将 求解题目 转换为 求解N个 小问题 ,
  3.         每个小问题的 求解过程相同 ,但是 过程涉及 的 数据 是不同的 ,
  4.         例如第三个 小问题的 结果 也 会影响 第 四个 小问题 的 求解。(看情况保存结果)

class Solution {
public:
bool find(string str,vector<string>&k)
{for (auto tem : k){if (tem == str)return true;}return false;
}
bool wordBreak(string s, vector<string>&wordDict) {vector<bool> dp(s.length() + 1);     dp[0] = true;for (int i = 1; i < s.length() + 1; i++){for (int j = 0; j < i; j++){if (dp[i - j - 1] && (find(s.substr(i - j - 1, j + 1), wordDict))){dp[i] = true;break;}}}return dp[s.length()];}
};

三角形中最小路径之和 

class Solution {
public:int minimumTotal(vector<vector<int>>& triangle) {if(triangle.size() == 1)return triangle[0][0];for(int i = triangle.size()-2;i>= 0;i--){for(int j = 0; j < triangle[i].size();j++){triangle[i][j] += (triangle[i+1][j] < triangle[i+1][j+1]) ? triangle[i+1][j] : triangle[i+1][j+1];}}return triangle[0][0];}
};

class Solution {
public:int uniquePaths(int m, int n) {int arr[100][100];for(int i = 0; i < m;i++)for(int j = 0 ;j < n ;j++)arr[i][j] = 1;for(int i = 1;i < m;i++)for(int j = 1;j < n;j++)arr[i][j] = arr[i-1][j]+arr[i][j-1];return arr[m-1][n-1];}
};

 01背包

子问题 :

        子问题 : 在 x 个 物品中 选取 填满 容量为 y  的 容器 ,使其 价值最大

        子问题之间关联 : 如果当前第 i 件 商品能 容纳 ,则判断是否 容纳 ,如果可以容纳

                                      容纳后的总价值 = 利用容纳后剩余容量的 最大价值 + 第 i 件商品的价值

                                      如果不容纳 ( 容量不够 , 或者容纳后价值 < 不容纳的价值)

                                      不容纳的价值总价值 =  当前容量(x)下 的 能 选取 (i-1)件商品下的最大值

class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 计算01背包问题的结果* @param V int整型 背包的体积* @param n int整型 物品的个数* @param vw int整型vector<vector<>> 第一维度为n,第二维度为2的二维数组,vw[i][0],vw[i][1]分别描述i+1个物品的vi,wi* @return int整型*/int knapsack(int V, int n, vector<vector<int> >& vw) {vector<vector<int>> arr(n,vector<int>(V+1,0));for(int i = 0 ; i < V+1 ; i++){arr[0][i] = (i >= vw[0][0]) ? vw[0][1] : 0;                                             }for(int i = 1 ; i < n;i++){for(int j = 1 ; j < V+1 ;j++){if(vw[i][0] <= j)arr[i][j] = (arr[i-1][j] > arr[i-1][j - vw[i][0]]+vw[i][1]) ? arr[i-1][j] : arr[i-1][j - vw[i][0]]+vw[i][1];else  arr[i][j] = arr[i-1][j];}}return arr[n-1][V];// 方法二  : 用 一维数组 --------// 要逆序 因为 要 用的 是 上一行数据 ,如果正序 就会用到每次更新好的 数据vector<int> arr(V+1,0);for(int i = 0 ; i < n;i++){// for(int j = 1 ; j < V+1;j++)for(int j = V ; j > 0;j--){if(vw[i][0] <= j){arr[j] = (arr[j] > arr[j - vw[i][0]] + vw[i][1]) ? arr[j] : arr[j-vw[i][0]] + vw[i][1];}cout << arr[j] << '|';}cout << '-' ;}return arr[V];}    }
};

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {for(int i = 2 ; i < cost.size()+1; i++){int tem = (cost[i-1] > cost[i-2]) ? cost[i-2] : cost[i-1];if(i == cost.size())return tem;else cost[i]+=tem;}return 0;}
};

class Solution {
public:bool ispalindrome(string s){for(int left = 0 ,right = s.length()-1;left < right; left++,right--){if(s[left] != s[right])return false;}return true;}// int minCut(string s) {//     vector<vector<int>> arr(26, vector<int>(s.length()+1, 0));//     int sumtime = 0;//     vector<int> dp(s.length()+1, 0);//     for (int i = 0; i < s.length(); i++)//     {//         arr[s[i] - 97][arr[s[i] - 97][0] + 1] = i;//         arr[s[i] - 97][0]++;//     }//     for (int i = 1; i < s.length(); i++)//     {//         int aim = -1;//         dp[i] = i;//         for (int aimi = 1;;aimi++)//         {//             aim = arr[s[i] - 97][aimi];//             if(ispalindrome(s.substr(aim,i-aim+1)))//             {//                 if(aim == 0)//                 {//                     dp[i] = 0;//                     break;//                 }//                 else //                 {//                     dp[i] = (dp[i]> dp[aim-1]+1) ? dp[aim-1]+1 : dp[i];//                 }//             }//             if(aim == i)//             break;//         }//     }//     return dp[s.length() - 1];// }int minCut(string s) {vector<int>dp (s.length()+1,0);for(int i =1 ;i < s.length();i++){dp[i] = i;for(int j = i;j>=0;j--){if(ispalindrome(s.substr(j,i-j+1))){if(j == 0){dp[i] = 0;break;}dp[i] = (dp[i] < dp[j-1]+1)?dp[i]:dp[j-1]+1;}}}return dp[s.length()-1];}vector<vector<bool>> Premate(string & s){vector<vector<bool>> RT_pre(s.length(),vector<bool>(s.length(),true));for(int i = 0; i < s.length();i++){for(int j = i ;j >= 0;j--){if(i - j == 0)RT_pre[i][j] = true;else if(i - j == 1)RT_pre[i][j] = s[i] == s[j];else RT_pre[i][j] = (s[i] == s[j]) && RT_pre[i-1][j+1];}}return RT_pre;}int minCut(string s) {vector<vector<bool>> RT_pre = Premate(s);vector<int>dp (s.length()+1,0);for(int i =1 ;i < s.length();i++){dp[i] = i;for(int j = i;j>=0;j--){// if(ispalindrome(s.substr(j,i-j+1)))if(RT_pre[i][j]){if(j == 0){dp[i] = 0;break;}dp[i] = (dp[i] < dp[j-1]+1)?dp[i]:dp[j-1]+1;}}}return dp[s.length()-1];}
};
class Solution {
public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.length()+1,vector<int>(word2.length()+1,0));for(int i = 0; i < word2.length()+1;i++)dp[0][i] = i;for(int i = 0; i < word1.length()+1;i++)dp[i][0] = i;for(int i = 1; i < word1.length()+1;i++){for(int j = 1 ;j < word2.length()+1;j++){if(word1[i-1] == word2[j-1])dp[i][j] = dp[i-1][j-1];else dp[i][j] = std::min(std::min(dp[i-1][j-1],dp[i-1][j]),dp[i][j-1])+1;}}                return dp[word1.length()][word2.length()];}
};

class Solution {
public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.length()+1,vector<int>(word2.length()+1,0));for(int i = 0; i < word2.length()+1;i++)dp[0][i] = i;for(int i = 0; i < word1.length()+1;i++)dp[i][0] = i;for(int i = 1; i < word1.length()+1;i++){for(int j = 1 ;j < word2.length()+1;j++){if(word1[i-1] == word2[j-1])dp[i][j] = dp[i-1][j-1];else dp[i][j] = std::min(std::min(dp[i-1][j-1],dp[i-1][j]),dp[i][j-1])+1;}}                return dp[word1.length()][word2.length()];}
};

class Solution {
public:int numDistinct(string s, string t) {vector<vector<long long>> dp(t.length(),vector<long long>(s.length()+1,0));for(int i = 1; i < s.length()+1;i++){if(t[0] == s[i-1])dp[0][i] = dp[0][i-1]+1;else dp[0][i] = dp[0][i-1];}    for(int i = 1;i < t.length();i++){for(int j = 1 ; j < s.length()+1;j++){if(t[i] == s[j-1]){dp[i][j] = (dp[i-1][j-1]+dp[i][j-1])%1000000007;}else {dp[i][j] = dp[i][j-1];}}}return dp[t.length()-1][s.length()];}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++网络编程实战——开发基于ftp协议的文件传输模块(二) 配置ftp服务与手动执行ftp命令

配置FTP服务 一.前言 博主的环境是阿里云服务器&#xff0c;操作系统版本为 ubuntu20.04,一下所有操作都基于以上环境下进行的操作&#xff0c;同时为了简化操作我将开放同一个云服务器的不同端口&#xff0c;让它同时充当服务端和客户端&#xff0c;大家如果想测试效果更好且…

WPF串口通讯程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using HardwareCommunications; using System.IO.Ports; using System.Windows;namespace PortTest {/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainW…

软件缺陷(Bug)、禅道

目录 软件缺陷的判定标准 软件缺陷的核心内容 构成缺陷的基本要素 缺陷报告 缺陷管理 缺陷的跟踪流程 项目管理工具--禅道 软件在使用过程中存在的任何问题&#xff08;如&#xff1a;错误、异常等&#xff09;&#xff0c;都叫软件的缺陷&#xff0c;简称bug。 软件缺…

如何选择海洋船舶用总线NMEA 2000连接器

NMEA 2000连接器概述 NMEA 2000连接器是现代船舶通信系统中不可或缺的部分&#xff0c;主要用于连接船上各种电子设备&#xff0c;实现数据传输和设备控制。这些连接器遵循NMEA 2000协议标准&#xff0c;支持高速数据传输&#xff0c;并具有良好的防水、耐腐蚀性能&#xff0c…

神经网络之循环神经网络

目录 一、循环神经网络概述&#xff1a;1.传统神经网络与循环神经网络的区别&#xff1a;2.循环神经网络定义&#xff1a; 图片来自&#xff1a;深度学习———循环神经网络 一、循环神经网络概述&#xff1a; 1.传统神经网络与循环神经网络的区别&#xff1a; MLP、卷积神经…

【PostgreSQL教程】PostgreSQL 选择数据库

博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

多目标遗传算法(NSGAⅢ)的原理和matlab实现

参考文献&#xff1a; [1] Deb K , Jain H .An Evolutionary Many-Objective Optimization Algorithm Using Reference-Point-Based Nondominated Sorting Approach, Part I: Solving Problems With Box Constraints[J].IEEE Transactions on Evolutionary Computation, 2014,…

【Simple PIR】单服务器开源最快匿踪查询算法解析

7月17日&#xff0c;我们在《隐私计算匿踪查询技术深入浅出》中介绍了关于隐私计算中匿踪查询的定义和常见算法&#xff0c;并引出了前沿算法Simple PIR的介绍&#xff0c;本次将对Simple PIR进行正式的算法原理介绍。 1. Simple PIR快览 1.1 性能介绍 Simple PIR是Alexandra…

docker 打包orbbec

docker pull humble容器 sudo docker run -it osrf/ros:humble-desktop docker 启动容器 sudo docker run -u root --device/dev/bus/usb:/dev/bus/usb -it -v /home/wl:/share --name wl4 osrf/ros:humble-desktop /bin/bash新开一个终端 查看本地存在的容器&#xff1a;…

高速ADC模拟输入接口设计

目录 基本输入接口考虑 输入阻抗 输入驱动 带宽和通带平坦度 噪声 失真 变压器耦合前端 有源耦合前端网络 基本输入接口考虑 采用高输入频率、高速模数转换器(ADC)的系统设计是一 项具挑战性的任务。ADC输入接口设计有6个主要条件&#xff1a; 输入阻抗、输入驱动、带宽…

开源模型应用落地-FastAPI-助力模型交互-进阶篇-中间件(四)

一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理&#xff0c;使应用程序能够处理各种不同的请求场景&#xff0c;提高应用程序的灵活性和可扩展性。 在数据验证和转换方面&#xff0c;高级用法提供了更精细和准确的控制&#…

IPython魔法命令的深入应用

目录 IPython魔法命令的深入应用 一、魔法命令基础 1. 魔法命令的分类 2. 基本使用 二、高级应用技巧 1. 数据交互与处理 2. 交互式编程与调试 三、魔法命令的进阶操作 1. 自定义魔法命令 2. 利用魔法命令优化工作流程 四、总结与展望 IPython魔法命令的深入应用 IP…

vulnhub——Ai-Web1靶机渗透

Ai-Web1靶机渗透 靶机下载&#xff1a; 官网地址&#xff1a;https://www.vulnhub.com/entry/ai-web-1,353/ 攻击机&#xff1a;kali2024 一、信息收集 发下目标主机的IP为&#xff1a;192.168.201.141 用nmap工具扫描一下对方主机和服务 发现他打开了80端口 发现搜不到于是…

人是一个AI Agent吗?

人是一个AI Agent吗&#xff1f; 什么是AI Agent&#xff1f;人类的感知能力人类的推理与决策人类的执行能力人类的学习能力人类作为AI Agent的局限性结论 随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;AI已经在许多领域展现出其强大的能力。AI Agent&…

详解数据结构之二叉树(堆)

详解数据结构之二叉树(堆) 树 树的概念 树是一个非线性结构的数据结构&#xff0c;它是由 n(n>0)个有限节点组成的一个具有层次关系的集合&#xff0c;它的外观形似一颗倒挂着的树&#xff0c;根朝上&#xff0c;叶朝下&#xff0c;所以称呼为树。每颗子树的根节点有且只…

QXlsx读写excel

QXlsx读写excel 安装 QXlsx使用 qmake使用 CMake 基本用法1. 写入 Excel 文件2. 读取 Excel 文件 详细用法1. 设置单元格样式2. 合并单元格3. 创建图表4. 设置列宽和行高 完整示例 QXlsx 是一个用于在 Qt 应用中读写 Excel 文件的第三方库。它提供了丰富的 API&#xff0c;可以…

autoware.universe源码略读(3.17)--perception:occupancy_grid_map_outlier_filter

autoware.universe源码略读3.17--perception:occupancy_grid_map_outlier_filter Overview&#xff08;Class&#xff09;RadiusSearch2dfilter&#xff08;Class Constructor&#xff09;RadiusSearch2dfilter::RadiusSearch2dfilter&#xff08;mFunc&#xff09;RadiusSearc…

2月科研——arcgis计算植被差异

ArcGIS中&#xff0c;设置高于或低于某个值的像元为 -9999&#xff0c;然后将这些地方设为空——目的&#xff1a;去除异常值和黑色背景值 Con(("T_std ano7.tif" > 2) | ("T_std ano7.tif" < - 2), - 9999,"T_std ano7.tif") SetNull(&…

python基础语法 007 文件操作-1读取写入

1 文件操作 1.1 什么时候用文件操作&#xff1f; 打开文档写东西看东西拿文档做统计 在python 文档操作作用 存储数据读取数据 打开文件有什么用&#xff1f; 读取数据&#xff0c;写入数据不管什么数据都可以用open打开&#xff0c;如可复制一张图片 1.2 open() 读取,…

【嵌入式DIY实例-ESP8266篇】-LCD ST7789显示BMP280传感器数据

LCD ST7789显示BMP280传感器数据 文章目录 LCD ST7789显示BMP280传感器数据1、硬件准备与接线2、代码实现在本文中,将介绍如何通过 ESP8266 NodeMCU 开发板 (ESP-12E) 与 ST7789 TFT 显示屏连接。 在此项目中,我们将了解如何将 ESP8266 NodeMCU 板与 Bosch Sensortec 的 BMP2…