复习动态规划入门

题目:

最小花费爬楼梯

暴力:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n;
int cost[N];
int dfs(int x)
{if(x == 0 || x == 1)return 0;elsereturn min(dfs(x-1) + cost[x-1],dfs(x-2) + cost[x-2]);
}
int main()
{cin >> n;for(int i = 0 ; i < n ; i++)cin >> cost[i];cout << dfs(n);return 0; 
}

记忆化搜索:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n;
int cost[N];
int mem[N];//到达第i层之前最小花费 
int dfs(int x)
{int sum = 0;if(mem[x])return mem[x]; if(x == 0 || x == 1)return 0;elsesum = min(dfs(x-1) + cost[x-1],dfs(x-2) + cost[x-2]);mem[x] = sum;return sum;
}
int main()
{cin >> n;for(int i = 0 ; i < n ; i++)cin >> cost[i];cout << dfs(n);return 0; 
}

dp1:

dp定义到达第i层前最小花费

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n;
int cost[N];
int f[N];//到达第i层最小花费 
int main()
{cin >> n;for(int i = 0 ; i < n ; i++)cin >> cost[i];f[0] = f[1] = 0;for(int i = 2 ; i <= n ; i++){f[i] = min(f[i-1]+cost[i-1],f[i-2]+cost[i-2]);}//cout << f[n];for(int i = 0 ; i <= n ; i++)cout <<f[i] << " "; return 0; 
}

dp2:

dp定义到达第i层的最小花费

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n;
int cost[N];
int f[N];//到达第i层最小花费 
int main()
{cin >> n;for(int i = 0 ; i < n ; i++)cin >> cost[i];f[0] = 0;for(int i = 1 ; i <= n ; i++){f[i] = min(f[i-1]+cost[i-1],f[i-2]+cost[i-2]);}cout << f[n];
/*	for(int i = 0 ; i <= n ; i++)cout <<f[i] << " "; */return 0; 
}

最长递增子序列:
B3637 最长上升子序列 - 洛谷 | 计算机科学教育新生态

dfs:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n;
int arr[N];
int f[N];
int dfs(int x)
{int sum = 1;for(int i = 1 ; i < x ; i++)//注意是< {if(arr[i] < arr[x]){sum = max(sum,dfs(i) + 1);}}return sum;
}
int main()
{int ans = -1;cin >> n;for(int i = 1 ; i <= n ; i++)cin >> arr[i];for(int i = 1 ; i <= n ; i++){ans = max(ans,dfs(i));} cout << ans; return 0; 
}

记忆化搜索:
 

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n;
int arr[N];
int mem[N];//存的是以i为结尾最长上升子序列的最大值 
int dfs(int x)
{int sum = 1;if(mem[x])return mem[x]; for(int i = 1 ; i < x ; i++)//注意是< {if(arr[i] < arr[x]){sum = max(sum,dfs(i) + 1);}}mem[x] = sum;return sum;
}
int main()
{int ans = -1;cin >> n;for(int i = 1 ; i <= n ; i++)cin >> arr[i];for(int i = 1 ; i <= n ; i++){ans = max(ans,dfs(i));} cout << ans; return 0; 
}

dp:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n;
int arr[N];
int f[N];//存的是以i为结尾最长上升子序列的最大值 int main()
{int ans = -1;cin >> n;for(int i = 1 ; i <= n ; i++){cin >> arr[i];f[i] = 1;		}for(int i = 1 ; i <= n ; i++){for(int j = 1 ; j < i ; j++){if(arr[j] < arr[i]){f[i] = max(f[i],f[j] + 1);}}} for(int i = 1 ; i <= n ; i++)ans = max(ans,f[i]);cout << ans; return 0; 
}

零钱兑换

B3635 硬币问题 - 洛谷 | 计算机科学教育新生态

记忆化搜索:
 

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1e6+10;
int n;
int len = 0;
int arr[10] = {1,5,11};
int mem[N];
int dfs(int x)
{int sum = 1e9;if(mem[x])return mem[x];if(x == 0 || x < 0)return 0;for(int i = 0 ; i < 3 ; i++){if(arr[i] <= x){sum = min(sum,dfs(x - arr[i]) + 1);}}mem[x] = sum;return sum;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int x;cin >> n;cout << dfs(n); return 0;
}

dp:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 1e6 + 10;
int n;
int arr[10] = {1, 5, 11};
int f[N];int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for(int i = 1 ; i <= n ; i++)f[i] = 1e9;for (int i = 0; i <= n; ++i) {for (int j = 0; j < 3; ++j){if (i >= arr[j]){f[i] = min(f[i], f[i - arr[j]] + 1);}}}if (f[n] == 1e9) {cout << -1; } else {cout << f[n];}return 0;
}

连续子数组的最大和:

贪心:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
const int N = 1e6+10;
int arr[N];
int main() 
{cin >> n;for(int i = 1 ; i <= n ; i++)cin >> arr[i];int ans = -1e9,sum = 0;for(int i = 1 ; i <= n ; i++){if(sum < 0)sum = 0;sum += arr[i];ans = max(ans,sum);}cout << ans;return 0;
}
/* 
9
-2 1 -3 4 -1 2 1 -5 4
*/
  1. 局部最优到全局最优的转换:Kadane's Algorithm通过维护一个当前子数组的最大和(sum)和一个全局最大和(ans),在遍历数组时,如果当前子数组的和变为负数,则重新开始计算新的子数组和(即重置sum为0)。这种方法确保了每一步都是在尝试找到以当前元素为结尾的子数组中的最大和。由于我们总是在更新ans为遇到的最大子数组和,因此当遍历结束时,ans就是全局最大子数组和。

  2. 无需回溯:与动态规划等方法不同,Kadane's Algorithm不需要回溯或存储中间状态。它只依赖于当前遍历到的元素和之前的累积和,这使得算法非常高效,时间复杂度为O(n)。

  3. 贪心选择的正确性:在这个特定问题中,贪心选择的正确性在于我们总是尝试扩展当前子数组(只要它的和仍然是非负的),或者当遇到一个使当前子数组和变为负数的元素时,我们重新开始一个新的子数组。这种方法确保了我们不会错过任何可能构成全局最大子数组的部分。

  4. 问题的特定结构:最大子数组和问题具有一种特殊结构,使得局部最优解(以当前元素为结尾的最大子数组和)能够直接导向全局最优解(整个数组中的最大子数组和)。这种结构是贪心算法能够成功应用的关键。

暴力dfs:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
const int N = 1e6+10;
int arr[N];
int dfs(int x)
{if(x == 0)return 0;int sum = -1e9;sum = max(arr[x],dfs(x - 1) + arr[x]);return sum;
}
int main() 
{int ans = -1e9;cin >> n;for(int i = 1 ; i <= n ; i++)cin >> arr[i];for(int i = 1 ; i <= n ; i++){ans = max(ans,dfs(i));}cout << ans;return 0;
}
/* 
9
-2 1 -3 4 -1 2 1 -5 4
*/

记忆化搜索:
 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
const int N = 1e6+10;
int arr[N];
int mem[N]; 
int dfs(int x)
{if(mem[x])return mem[x];if(x == 0)return 0;int sum = -1e9;sum = max(arr[x],dfs(x - 1) + arr[x]);mem[x] = sum;return sum;
}
int main() 
{int ans = -1e9;cin >> n;for(int i = 1 ; i <= n ; i++)cin >> arr[i];for(int i = 1 ; i <= n ; i++){ans = max(ans,dfs(i));}cout << ans;return 0;
}
/* 
9
-2 1 -3 4 -1 2 1 -5 4
*/

动态规划:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
const int N = 1e6+10;
int arr[N];
int f[N]; 
/*int dfs(int x)
{if(mem[x])return mem[x];if(x == 0)return 0;int sum = -1e9;sum = max(arr[x],dfs(x - 1) + arr[x]);mem[x] = sum;return sum;
}*/
int main() 
{int ans = -1e9;cin >> n;for(int i = 1 ; i <= n ; i++)cin >> arr[i];for(int i = 1 ; i <= n ; i++){f[i] = max(f[i] , f[i-1] + arr[i]);}for(int i = 1 ; i <= n ; i++){if(ans < f[i])ans = f[i];}cout << ans;return 0;
}
/* 
9
-2 1 -3 4 -1 2 1 -5 4
*/

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

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

相关文章

Flutter_学习记录_导航和其他

Flutter 的导航页面跳转&#xff0c;是通过组件Navigator 和 组件MaterialPageRoute来实现的&#xff0c;Navigator提供了很多个方法&#xff0c;但是目前&#xff0c;我只记录我学习过程中接触到的方法&#xff1a; Navigator.push(), 跳转下一个页面Navigator.pop(), 返回上一…

mathematical-expression 实现 数学表达式解析 Java 篇(最新版本)

mathematical-expression &#xff08;MAE&#xff09; 切换至 中文文档 Community QQ group 访问链接进行交流信息的获取&#xff1a;https://diskmirror.lingyuzhao.top/DiskMirrorBackEnd/FsCrud/downLoad/18/Binary?fileNameArticle/Image/-56202138/1734319937274.jpg…

http的请求体各项解析

一、前言 做Java开发的人员都知道&#xff0c;其实我们很多时候不单单在写Java程序。做的各种各样的系统&#xff0c;不管是PC的 还是移动端的&#xff0c;还是为别的系统提供接口。其实都离不开http协议或者https 这些东西。Java作为编程语言&#xff0c;再做业务开发时&#…

Java 大视界 -- Java 大数据中的自然语言生成技术与实践(63)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

计算机网络三张表(ARP表、MAC表、路由表)总结

参考&#xff1a; 网络三张表&#xff1a;ARP表, MAC表, 路由表&#xff0c;实现你的网络自由&#xff01;&#xff01;_mac表、arp表、路由表-CSDN博客 网络中的三张表&#xff1a;ARP表、MAC表、路由表 首先要明确一件事&#xff0c;如果一个主机要发送数据&#xff0c;那么必…

Git Bash 配置 zsh

博客食用更佳 博客链接 安装 zsh 安装 Zsh 安装 Oh-my-zsh github仓库 sh -c "$(curl -fsSL https://install.ohmyz.sh/)"让 zsh 成为 git bash 默认终端 vi ~/.bashrc写入&#xff1a; if [ -t 1 ]; thenexec zsh fisource ~/.bashrc再重启即可。 更换主题 …

【问题】Chrome安装不受支持的扩展 解决方案

此扩展程序已停用&#xff0c;因为它已不再受支持 Chromium 建议您移除它。详细了解受支持的扩展程序 此扩展程序已停用&#xff0c;因为它已不再受支持 详情移除 解决 1. 解压扩展 2.打开manifest.json 3.修改版本 将 manifest_version 改为3及以上 {"manifest_ver…

在 Windows 系统上,将 Ubuntu 从 C 盘 迁移到 D 盘

在 Windows 系统上&#xff0c;如果你使用的是 WSL&#xff08;Windows Subsystem for Linux&#xff09;并安装了 Ubuntu&#xff0c;你可以将 Ubuntu 从 C 盘 迁移到 D 盘。迁移过程涉及导出当前的 Ubuntu 发行版&#xff0c;然后将其导入到 D 盘的目标目录。以下是详细的步骤…

qt QNetworkRequest详解

1、概述 QNetworkRequest是Qt网络模块中的一个核心类&#xff0c;专门用于处理网络请求。它封装了网络请求的所有关键信息&#xff0c;包括请求的URL、HTTP头部信息等&#xff0c;使得开发者能够方便地在Qt应用程序中执行网络操作&#xff0c;如文件下载、网页内容获取等。QNe…

Python!从0开始学爬虫:(一)HTTP协议 及 请求与响应

前言 爬虫需要基础知识&#xff0c;HTTP协议只是个开始&#xff0c;除此之外还有很多&#xff0c;我们慢慢来记录。 今天的HTTP协议&#xff0c;会有助于我们更好的了解网络。 一、什么是HTTP协议 &#xff08;1&#xff09;定义 HTTP&#xff08;超文本传输协议&#xff…

后盾人JS -- Map与WeakMap类型在JavaScript中的使用

Map类型特点与创建方法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> &l…

python实现http文件服务器访问下载

//1.py import http.server import socketserver import os import threading import sys# 获取当前脚本所在的目录 DIRECTORY os.path.dirname(os.path.abspath(__file__))# 设置服务器的端口 PORT 8000# 自定义Handler&#xff0c;将根目录设置为脚本所在目录 class MyHTT…

[STM32 - 野火] - - - 固件库学习笔记 - - -十一.电源管理系统

一、电源管理系统简介 电源管理系统是STM32硬件设计和系统运行的基础&#xff0c;它不仅为芯片本身提供稳定的电源&#xff0c;还通过多种电源管理功能优化功耗、延长电池寿命&#xff0c;并确保系统的可靠性和稳定性。 二、电源监控器 作用&#xff1a;保证STM32芯片工作在…

二叉树相关oj题 1. 检查两颗树是否相同。

二叉树相关oj题 检查两颗树是否相同。OJ链接 另一颗树的子树。OJ链接 if(rootnull)易漏掉 会导致空指针异常翻转二叉树。OJ链接

批量提取多个 Excel 文件内指定单元格的数据

这篇文章将介绍如何从多个相同格式的Excel文件中&#xff0c;批量提取指定单元格的数据&#xff0c;合并后保存到新的工作薄。 全程0代码&#xff0c;可视化操作。 提取前&#xff1a; 提取后&#xff1a; 准备数据 这里准备了3个测试数据 开始提取 打开的卢易表&#xff0…

【真机调试】前端开发:移动端特殊手机型号有问题,如何在电脑上进行调试?

目录 前言一、怎么设置成开发者模式&#xff1f;二、真机调试基本步骤&#xff1f; &#x1f680;写在最后 前言 edge浏览器 edge://inspect/#devices 谷歌浏览器&#xff08;开tizi&#xff09; chrome://inspect 一、怎么设置成开发者模式&#xff1f; Android 设备 打开设…

GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比

GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比 目录 GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于GA-CNN-LST…

C++入门14——set与map的使用

在本专栏的往期文章中&#xff0c;我们已经学习了STL的部分容器&#xff0c;如vector、list、stack、queue等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层是线性序列的数据结构&#xff0c;里面存储的是元素本身。而本篇文章我们要来认识一下关联式容器。 &am…

从崩溃难题看 C 标准库与 Rust:线程安全问题引发的深度思考

在软件开发的世界里&#xff0c;每一次技术的变革和尝试都伴随着未知的挑战。EdgeDB 团队在将部分网络 I/O 代码从 Python 迁移到 Rust 的过程中&#xff0c;就遭遇了一场棘手的问题&#xff0c;这个问题不仅暴露了 C 标准库的线程安全隐患&#xff0c;也让我们对 Rust 的 “安…

班迪录屏:一款好用的屏幕录制软件

Bandicam&#xff08;班迪录屏&#xff09;是一款4K超清屏幕录像软件&#xff0c;最新版Bandicam v8.1.0.2516 绿色正式版已经集成授权信息&#xff0c;用户无需联网验证授权&#xff0c;启动软件即可直接使用已授权版本&#xff0c;享受良好的录制体验。这款软件完全摆脱了试用…