算法实验二 矩阵最小路径和 LIS

算法实验课二

矩阵最小路径和

leetcode裸题

最小路径和

给定一个包含非负整数的 *m* x *n* 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

img

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

  • m == grid.length

  • n == grid[i].length

  • 1 <= m, n <= 200

  • 0 <= grid[i][j] <= 200

class Solution {
public://dp[i][j]代表该位置上的最小和//dp[i][j] = dp[i-1][j]) if(grid[i-1][j] > )int minPathSum(vector<vector<int>>& grid) {int m = grid.size();//行数int n = grid[0].size();//列数
​vector<vector<int>> dp = grid;for(int i = 1; i < m; i ++)dp[i][0] = dp[i][0] + dp[i - 1][0];for(int j = 1; j < n; j ++)dp[0][j] = dp[0][j] + dp[0][j - 1];for(int i = 1; i < m; i ++){for(int j = 1; j < n; j ++){dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + dp[i][j];// dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];}}
​return dp[m - 1][n - 1];}
};

完整实现

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
typedef long long LL;
LL dp[N][N];
LL grid[N][N];
int n, m;
​
int main()
{cin >> n >> m;for(int i = 1; i <= n; i ++)for(int j = 1; j <= m; j ++){cin >> grid[i][j];dp[i][j] = grid[i][j];//初始化}for(int i = 1; i <= n; i ++)dp[i][1] = dp[i][1] + dp[i - 1][0];for(int j = 1; j <= m; j ++)dp[1][j] = dp[1][j] + dp[1][j - 1];for(int i = 1; i <= n; i ++){for(int j = 1; j <= m; j ++){dp[i][j] += min(dp[i - 1][j], dp[i][j - 1]);}}cout << dp[n][m] << endl;return 0;
}

LIS最长上升子序列

image-20240402221428416

image-20240402221459580

题目练习

1.蓝桥勇士

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int dp[N];//表示以a[i]结尾的最长上升子序列的长度
int a[N];
int n;
​
int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n;for(int i = 1; i <= n; i ++){cin >> a[i];dp[i] = 1;//初始化}for(int i = 1; i <= n; i ++)for(int j = 1; j < i; j ++)if(a[j] < a[i])dp[i] = max(dp[i], dp[j] + 1);//状态转移方程
​int res = -0x3f3f3f3f;//答案初始为一个最小值for(int i = 1; i <= n; i ++)//判断以哪个a[i]结尾是最长的上升子序列res = max(res, dp[i]);cout << res << endl;return 0;
}

判断以哪个a[i]结尾是最长的上升子序列可以偷懒使用库函数

// int res = -0x3f3f3f3f;//答案初始为一个最小值 // for(int i = 1; i <= n; i ++)//判断以哪个a[i]结尾是最长的上升子序列 // res = max(res, dp[i]);

cout << *max_element(dp + 1, dp + 1 + n) << endl;

以上最长上升子序列(LIS)算法时间复杂度O(n^2)

还有一种实现方式,可以利用二分实现O(nlogn)的时间复杂度

题目二

1.合唱队形

image-20240402221625696

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int a[N], dp1[N], dp2[N], n;
​
int main()
{cin >> n;for(int i = 1; i <= n; i ++){cin >> a[i];dp1[i] = 1;dp2[i] = 1;}
​for(int i = 1; i <= n; i ++)for(int j = 1; j < i; j ++)if(a[j] < a[i])dp1[i] = max(dp1[i], dp1[j] + 1);for(int i = n; i ; i --)for(int j = n; j > i; j --)if(a[j] < a[i])dp2[i] = max(dp2[i], dp2[j] + 1);int res = -0x3f3f3f3f;for(int i = 1; i <= n; i ++)res = max(res, dp1[i] + dp2[i] - 1);cout << n - res << endl;return 0;
}

leetcode裸题

300. 最长递增子序列 - 力扣(LeetCode)

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int dp[2550];if(nums.size() == 0)return 0;for(int i = 0; i < nums.size(); i ++){dp[i] = 1;//初始化for(int j = 0; j < i; j ++)if(nums[j] < nums[i])dp[i] = max(dp[i], dp[j] + 1);}
​return *max_element(dp, dp + nums.size());
​}
};

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

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

相关文章

算法 - 符号表-上

&#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 算法 - 符号表前言初级实现1. 链表实现无序符号表2. 二分查找实现有序符号表 二叉查找树1. get()2. put()3. 分析4. floor()5. rank()6. min()7. deleteMin()8. delete()9. keys()10. 分析 算法 - 符号表 前言 符号表&am…

intellij idea 使用git撤销(取消)commit

git撤销(取消) 未 push的 commit Git&#xff0c;选择分支后&#xff0c;右键 Undo Commit &#xff0c;会把这个 commit 撤销。 git撤销(取消) 已经 push 的 commit 备份分支内容&#xff1a; 选中分支&#xff0c; 新建 分支&#xff0c;避免后续因为操作不当&#xff0c;导…

iOS-App:App Store新的审核政策,在应用隐私清单中声明和解释使用特定API的原因

App Store新的审核政策&#xff0c;在应用隐私清单中声明和解释使用特定API的原因 设备/引擎&#xff1a;Mac&#xff08;11.6&#xff09;/Mac Mini 开发工具&#xff1a;终端 开发需求&#xff1a;苹果官方邮件通知&#xff0c; App Store新的审核政策&#xff0c;在应用隐…

【Java笔记】多线程0:JVM线程是用户态还是内核态?Java 线程与OS线程的联系

文章目录 JVM线程是用户态线程还是内核态线程什么是用户态线程与内核态线程绿色线程绿色线程的缺点 线程映射稍微回顾下线程映射模型JVM线程映射 线程状态操作系统的线程状态JVM的线程状态JVM线程与OS线程的状态关系 Reference 今天复盘一下Java中&#xff0c;JVM线程与实际操作…

CCIE-08-BGP-Listen

目录 实验条件网络拓朴实验目的 开始配置配置动态路由协议配置BGP检查邻居配置 实验条件 网络拓朴 实验目的 将R1配置成Listen状态&#xff0c;自动接收来自其它路由器的建邻居请求、建立邻居 开始配置 配置动态路由协议 这里用EIGRP来配置&#xff0c;保证网络的可达性&a…

替代 Redis 和 Memcached:25 倍吞吐量! | 开源日报 No.213

dragonflydb/dragonfly Stars: 22.4k License: NOASSERTION Dragonfly 是一个内存数据存储&#xff0c;适用于现代应用工作负载&#xff0c;可替代 Redis 和 Memcached。与传统的内存数据存储相比&#xff0c;Dragonfly 提供了 25 倍的吞吐量、更高的缓存命中率和更低尾部延…

基于springboot的粮仓管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

java数组.day16(冒泡排序,稀疏数组)

冒泡排序 冒泡排序无疑是最为出名的排序算法之一&#xff0c;总共有八大排序! 冒泡的代码还是相当简单的&#xff0c;两层循环&#xff0c;外层冒泡轮数&#xff0c;里层依次比较&#xff0c;江湖中人人尽皆知。 我们看到嵌套循环&#xff0c;应该立马就可以得出这个算法的时…

TensorBoard可视化+Confustion Matrix Drawing

for later~ 代码阅读 1. 加载trainset import argparse import logging import os import numpy as npimport torch from torch import distributed from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterfrom backbones import get_…

2024年150道高频Java面试题(十七)

33. Stream API 在 Java 8 中是如何简化集合操作的 Java 8 引入的 Stream API 是一个强大的新特性&#xff0c;它极大地简化了集合操作的复杂性&#xff0c;提高了代码的可读性和效率。Stream API 允许开发人员以声明式的方式处理数据集合&#xff08;比如集合、数组等&#x…

1.Spring Boot框架整合

Spring Boot项目创建&#xff08;约定大于配置&#xff09; 2.1.3.RELEASE版本示例 idea创建 从官网下载&#xff08;https://start.spring.io/&#xff09;单元测试默认依赖不对时&#xff0c;直接删除即可 Web支持&#xff08;SpringMVC&#xff09; <dependency>&…

Collection与数据结构 链表与LinkedList(三):链表精选OJ例题(下)

1. 分割链表 OJ链接 class Solution {public ListNode partition(ListNode head, int x) {if(head null){return null;//空链表的情况}ListNode cur head;ListNode formerhead null;ListNode formerend null;ListNode latterhead null;ListNode latterend null;//定义…

见证历史:Quantinuum与微软取得突破性进展,开启了可靠量子计算的新时代!

Quantinuum与微软的合作取得了重大突破&#xff0c;将可靠量子计算带入了新的时代。他们结合了Quantinuum的System Model H2量子计算机和微软创新的量子比特虚拟化系统&#xff0c;在逻辑量子比特领域取得了800倍于物理电路错误率的突破。这一创新不仅影响深远&#xff0c;加速…

Java中Stream流介绍

Java 8引入的Stream API是Java中处理集合的一种高效方式&#xff0c;它提供了一种高级的迭代方式&#xff0c;允许你以声明式方式处理数据。Stream API可以对数据执行复杂的查询操作&#xff0c;而不需要编写冗长且复杂的循环语句。下面是一些使用Stream API的常见场景和示例&a…

Python数据分析与可视化笔记 九 分类问题

分类 分类是找出数据库中一组数据对象的共同特点&#xff0c;并按照分类模式将其划分为不同的类&#xff0c;其目的是通过分类模型&#xff0c;将数据库中的数据项映射到某个给定的类别。 分类学习是一类监督学习的问题&#xff0c;训练数据会包含其分类结果&#xff0c;根据分…

设计模式面试题(二)

1.单例优缺点 单例模式是一种常用的设计模式&#xff0c;它确保一个类仅有一个实例&#xff0c;并提供一个全局访问点。单例模式的使用具有一定的优点&#xff0c;同时也伴随着一些潜在的缺点。 优点 资源控制&#xff1a;单例模式能够确保资源如数据库连接或文件系统的一致…

目标检测——监控下的汽车

一、重要性及意义 首先&#xff0c;车辆检测技术是保证视频监控系统正常运行的基础。通过监控摄像头实时获取的图像&#xff0c;可以自动检测出图像中的车辆&#xff0c;并进行车辆类型的分类和识别。这对于优化城市交通管理、实现智能交通系统具有重要意义。此外&#xff0c;…

【无标题】html中使用div标签的坏处

在HTML中使用<div>作为布局元素时&#xff0c;尽管它已经成为现代Web开发的标准做法之一&#xff0c;并且与CSS结合使用可以实现灵活、语义化的布局设计&#xff0c;但也存在以下潜在的坏处或挑战&#xff1a; 复杂度增加&#xff1a; - 学习曲线&#xff1a;对于初学者…

【SQL Server的详细使用教程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【QT+QGIS跨平台编译】056:【pdal_lepcc+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_lepcc介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_lepcc介绍 pdal_lepcc 是 PDAL(Point Data Abstraction Library)的一个插件,用于点云数据的压缩。它基于 EPCC(Entwine Point Cloud Compression)算法,提供了对点…