【算法——1维动态规划具体例题】

1LCR 102. 目标和

分析:分成加法和减法两个集合

#include<iostream>
#include<vector>
using namespace std;
//目标和
vector<int>nums = { 1,1,1,1,1 };
int target = 3;
int dfs(int index, int sum)  
{//我前面老是错就是这一步出的问题,&&intdex==nums.size否则数组不是每个数都用到if (sum == target && index == nums.size()) return 1;  if (index >= nums.size()) return 0;return dfs(index + 1, sum + nums[index] * -1) + dfs(index + 1, sum + nums[index]);
}int main()
{cout << dfs(0, 0) << endl;//分成加法和减法集合  各自子集都是相加
//l+r=sum  sum就是nums所有 元素和
//l-r=target    
//l=(t+sum)/2   l不能整除说明没有组合满足   
//可以整除:把l看成一个容器,然后问题就转化为nums中选容器装满l的方法数int sum = 0;  //计数nums总和for (auto i : nums)sum += i;int left = 0;if (abs(target) > sum || (sum + target) % 2 != 0) return 0;else left = (sum+target) / 2;vector<int>dp(left + 1);dp[0] = 1;//i循环代表选择物品范围到哪里for (int i = 0; i < nums.size(); i++)   //遍历物品{for (int j = left; j >= nums[i]; j--)   //遍历容量   倒序是因为每个物品只能用一次cout << (dp[j] += dp[j - nums[i]]) << " ";cout << endl;}return 0;
}

斐波那契数列:

logO(n):从底到顶

#include<iostream>
#include<vector>
using namespace std;vector<int>memo(100,-1);
int fibonacci(int index)     //记忆化   上到下递推   O(n)
{if (memo[index] != -1)return memo[index];if (index == 0)return 0;if (index == 1)return 1;return memo[index] = fibonacci(index - 1) + fibonacci(index - 2);
}int main()
{int n;cin >> n;cout << fibonacci(n) << endl;vector<int>dp(n+1,0);     //dp  下到上递推   O(logn)dp[1] = 1;for (int i = 2; i <= n; i++)dp[i] = dp[i - 1] + dp[i - 2];cout << dp[n] << endl;return 0;
}

983. 最低票价

#include<iostream>
#include<vector>
using namespace std;
vector<int>durations = { 1,7,30 };    //存储天数的数组
//dfs   前  to 后
int dfs(int i, vector<int>costs, vector<int>days)
{if (i == days.size())return 0;int ans = INT_MAX;for (int k = 0, j = i; k < 3; k++){while (j < days.size() && days[i] + durations[k] > days[j])j++;ans = min(ans, dfs(j, costs, days) + costs[k]);}return ans;
}int main()
{vector<int>days = { 1,2,3,4,5,6,7,8,9,10,30,31 };vector<int>costs = { 2,7,15 };cout << dfs(0, costs, days) << endl;//dp   后 to 前vector<int>dp(days.size()+1);int n = days.size();dp[n] = 0;for (int i = n - 1; i >= 0; i--)   //dfs就是这个for替代   i:当前指向{int ans = INT_MAX;for (int k = 0, j = i; k < 3; k++)    //(1,7,30)三种方案{while (j < days.size() && days[i] + durations[k] > days[j])   //当前天+(1,7,30)方案 <= days[j]    j索引就是我的后续j++;ans = min(ans, dp[j] + costs[k]);   //三个方案花费选最小}dp[i] = ans;}for (auto i : dp)cout << i << " ";return 0;
}

91. 解码方法

这道题的理解:

注意这个return 1和dp[n]=1;

我们先说dfs,以123为例子,从1-3不停递归,直到越界,我们就知道匹配成功,返回1,然后开始匹配2个,又直到越界,利用这个”1“一直往前推。

然后dp就是dfs的傀儡,因为越界就成功,返回1;

#include<iostream>
#include<string>
#include<vector>
using namespace std;int dfs(string s,int i)
{//说明匹配成功if (i >= s.size()) return 1;int ans = 0;if (s[i] == '0')  //之前匹配模式有问题ans = 0;else{//s[i]!=0ans = dfs(s, i + 1);   //i字符匹配if (i + 1 < s.size() && (s[i] - '0') * 10 + s[i + 1] - '0' <= 26)   //符合结合条件ans += dfs(s, i + 2);    //i和i+1一起匹配;然后跳到i+2开始。} return ans;
}int main()
{string str("1123");cout << "dfs:" << dfs(str, 0) << endl << endl;int n = str.size();vector<int>dp(n + 1);    //这个dp含义:把当前这个算上,以及后面的字符;一共有多少种拼法dp[n] = 1;for (int i = n - 1; i >= 0; i--){int ans;if (str[i] == '0')ans = 0;else{ans= dp[i + 1];   //只选当前的if (i + 1 < n && (str[i] - '0') * 10 + str[i] - '0' <= 26)ans+= dp[i + 2];    //选当前和其下一个}dp[i] = ans;}cout << "dp:";for (auto i : dp)cout << i << " ";return 0;
}

解码方法2:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;long mod = 1000000007;    //答案和 10^9+7取余long dfs(int index, string str)
{long ans = 0;if (index == str.size())return 1;if (str[index] == '0')return 0;else{if (str[index] != '*'){ans = dfs(index + 1, str);if (index + 1 < str.size() && str[index + 1] != '*'){if (index + 1 < str.size() && (str[index] - '0') * 10 + str[index + 1] - '0' <= 26){ans += dfs(index + 2, str);}}else if (index + 1 < str.size() && str[index + 1] == '*'){if (str[index] == '1') ans += dfs(index + 2, str) * 9;else if (str[index] == '2') ans += dfs(index + 2, str) * 6;}}else if (str[index] == '*'){ans = 9 * dfs(index + 1, str);if (index + 1 < str.size()){if (str[index + 1] == '*'){ans += dfs(index + 2, str) * 15;}else if (str[index + 1] != '*'){if (str[index + 1] <= '6') ans += dfs(index+2,str) * 2;else ans += dfs(index + 2, str) * 1;}}}}return ans%mod;
}int main()
{string str = "7*9*3*6*3*0*5*4*9*7*3*7*1*8*3*2*0*0*6*";cout << dfs(0, str) << endl << endl;int n = str.size();vector<long long>dp(n + 1);dp[n] = 1;for (int index = n - 1; index >= 0; index--){if (str[index] != '0'){if (str[index] != '*'){dp[index] = dp[index + 1];if (index + 1 < str.size() && str[index + 1] != '*'){if (index + 1 < str.size() && (str[index] - '0') * 10 + str[index + 1] - '0' <= 26){dp[index] += dp[index + 2];}}else if (index + 1 < str.size() && str[index + 1] == '*'){if (str[index] == '1') dp[index] += dp[index + 2] * 9;else if (str[index] == '2') dp[index] += dp[index + 2] * 6;}}else if (str[index] == '*'){dp[index] = 9 * dp[index + 1];if (index + 1 < str.size()){if (str[index + 1] == '*'){dp[index] += dp[index + 2] * 15;}else if (str[index + 1] != '*'){if (str[index + 1] <= '6') dp[index] += dp[index + 2] * 2;else dp[index] += dp[index + 2] * 1;}}}}dp[index] %= mod;}for (auto i : dp)cout << (int)i << " ";return 0;
}

力扣字符串环绕

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<stack>
#include<string>
#include<map>
using namespace std;void dp1(string str)    //我的写法错误
{map<char, int>ma;for (int i = 0; i < str.size(); i++){if (str[i] == 'a' && i > 0 && str[i - 1] == 'z'){ma['a'] = ma['z'] + 1;}else if (i > 0 && str[i - 1] == str[i] - 1){ma[str[i]] = ma[str[i - 1]] + 1;}elsema[str[i]] = max(ma[str[i]], 1);}int ans = 0;for (auto i : ma){ans += i.second;cout << i.first << "-" << i.second << "    ";}cout << endl;cout << ans << endl << endl << endl;}void dp2(string str)    //纠正
{map<char, int>ma;int len = 0;for (int i = 0; i < str.size(); i++){if (i > 0 && (str[i] == 'a' && str[i - 1] == 'z' || str[i - 1] == str[i] - 1)){len++;}elselen = 1;ma[str[i]] = max(ma[str[i]], len);}int ans = 0;for (auto i : ma){ans += i.second;cout << i.first << "-" << i.second << "    ";}cout << endl;cout << ans << endl << endl << endl;}int main()
{string str("abcdefghijklmnopqrstuvwxymnopqrstuvwxyz");cout << str << endl << endl;dp1(str);dp2(str);return 0;
}

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

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

相关文章

Redis 集群 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 集群 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 集群 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 集群…

计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议

文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中&#xff0c;每一层都会添加自己的头部信息&#xff0c;最终形成完整的数据包。具体来说&#xff1a; 应用层生成的应用程序…

Java--反射机制

前言&#xff1a; 反射与之前的知识的区别 1.面向对象中创建对象&#xff0c;调用指定结构(属性、方法)等功能&#xff0c;可以不使用反射&#xff0c;也可以使用反射。请问有什么区别? 不使用反射&#xff0c;我们需要考虑封装性。比如:出了自定义类之后&#xff0c;就不能…

WPF+MVVM案例实战(六)- 自定义分页控件实现

文章目录 1、项目准备2、功能实现1、分页控件 DataPager 实现2、分页控件数据模型与查询行为3、数据界面实现 3、运行效果4、源代码获取 1、项目准备 打开项目 Wpf_Examples&#xff0c;新建 PageBarWindow.xaml 界面、PageBarViewModel.cs ,在用户控件库 UserControlLib中创建…

电池的主被动均衡

只有串联的电池需要进行电压均衡&#xff0c;并联的电池由于电压一致&#xff0c;所以并不需要进行均衡&#xff1a; 被动均衡有一个很明显的特征就是会看到很多大电阻&#xff0c;串联在MOS和电池之间&#xff1a;下图中的保护板就是被动均衡板子以及它的原理图&#xff1a; …

软硬件开发面试问题大汇总篇——针对非常规八股问题的提问与应答

软硬件开发&#xff0c;从微控制器编程到复杂的嵌入式系统开发&#xff0c;离不开下位机、操作系统、上位机等&#xff0c;涵盖范围很广。 如何快速一行代码操作硬件寄存器 直接操作硬件寄存器的代码通常依赖于特定平台和编程语言。在 C 或 C 中&#xff0c;常见的方法是使用指…

WORFBENCH:一个创新的评估基准,目的是全面测试大型语言模型在生成复杂工作流 方面的性能。

2024-10-10,由浙江大学和阿里巴巴集团联合创建的WORFBENCH&#xff0c;一个用于评估大型语言模型&#xff08;LLMs&#xff09;生成工作流能力的基准测试。它包含了一系列的测试和评估协议&#xff0c;用于量化和分析LLMs在处理复杂任务时分解问题和规划执行步骤的能力。WORFBE…

智慧停车场导航系统架构及反向寻车系统解决方案

一、系统概述&#xff1a; 随着当前室内定位导航技术在大型公共场所如政务中心、商业综合体、车站中的应用越来越多&#xff0c;人们对智慧停车场的需求也日益凸显出来&#xff0c;并且智慧停车场对大型公共场所智慧化的整体建设起到重要作用。如何更有效提高停车效率&#xf…

如何加密电脑磁盘?电脑本地磁盘加密方法介绍

随着信息技术的不断发展&#xff0c;电脑磁盘加密已经成为保护个人隐私和数据安全的重要手段。本文将介绍几种常见的电脑本地磁盘加密方法&#xff0c;帮助用户保护自己的数据安全。 文件夹只读加密专家 文件夹只读加密专家不仅可以加密电脑中的文件夹&#xff0c;还可以加密保…

Android 13 SystemUI 隐藏下拉快捷面板部分模块(wifi,bt,nfc等)入口

frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java createTileInternal(tileSpec)方法注释想隐藏的模块即可。

【C++进阶篇】——STL的简介

【C进阶篇】——STL的简介 1.什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 2.STL的版本 原始版本 Alexander Stepanov、Meng Lee 在…

redis集群配置

一、Redis集群的三种方式 Redis集群提供了三种分布式方案&#xff1a;主从模式&#xff1a;一个主节点和一个或多个从节点&#xff0c;主节点负责写操作&#xff0c;从节点负责读操作&#xff0c;实现读写分离&#xff0c;分担主节点的压力。哨兵模式&#xff1a;哨兵系统用于监…

【每日一题】LeetCode - 盛最多水的容器

给定一个长度为 n 的整数数组 height。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。要求找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 输入示例&#xff1a; height [1,8,6,2,5,4,8,3,7]输出&#xff1a; 4…

Python依赖库的几种离线安装方法

Python依赖库的几种安装方法 python经常需要安装一些依赖库&#xff0c;但是有时候环境可以连通python源&#xff0c;有时不能连通需要离线安装&#xff08;安装单个库包或者整个库环境&#xff09;&#xff0c;使用pip的如下方法可以相对简单解决问题。 一、如何copy一个pyt…

Linux 端口占用 kill被占用的端口 杀掉端口

1、yum install lsof 2、输入netstat -tln,查看系统当前所有被占用端口 3、根据端口查询进程,输入lsof -i :9555,切记不要忘了添加冒号 4、 既然知道进程号了,那杀死当前进程就简单多了,直接 kill -9 PID 回车

如何通过企业架构蓝图引导企业实现数字化转型:构建与实施的全方位指南

在当今迅速变化的商业环境中&#xff0c;企业进行数字化转型已成为提升竞争力、优化运营的必要手段。企业架构蓝图&#xff08;EA Blueprint&#xff09;作为指导企业数字化转型的战略工具&#xff0c;不仅提供了系统化的设计和规划路径&#xff0c;还帮助企业在技术与业务目标…

【读书笔记·VLSI电路设计方法解密】问题26:什么是漏电流问题

功耗现已成为半导体行业面临的主要技术难题。在当前基于CMOS的VLSI电路中,有两种主要的功耗来源:动态功耗和静态功耗。动态功耗来源于晶体管的切换以及芯片上数百万逻辑门输出端的电容反复充电和放电,是芯片为产生有效输出所消耗的能量。静态功耗则指即使在晶体管关闭时也会…

法治在沃刷积分-刷文章浏览数

最近有一个任务&#xff0c;需要通过浏览文章来获取积分&#xff0c;一个个手点文章太麻烦&#xff0c;专业的事情还得专业的来。 法1&#xff1a;模拟发包 抓包发现&#xff0c;是通过接口来使积分增长&#xff0c;那直接模拟发包即可。 至于info_id的获取&#xff0c;可以通…

2024年全球 MoonBit 编程创新赛-零基础早鸟教程-使用wasm4八小时开发井子棋小游戏

前言 本篇文章主要分享 “2024年全球 MoonBit 编程创新赛 游戏赛道”参赛过程中九宫棋游戏的开发技巧和心得。以此抛砖引玉。首先介绍下 MoonBit。 月兔语言 MoonBit 是一个用于云计算和边缘计算的 WebAssembly 端到端的编程语言工具链。 您可以访问 https://try.moonbitlang.…

文本预处理操作简述

自然语言处理 (NLP) 是数据科学的一个分支&#xff0c;主要处理文本数据。除了数值数据外&#xff0c;文本数据也广泛可用&#xff0c;用于分析和解决业务问题。然而&#xff0c;在使用数据进行分析或预测之前&#xff0c;处理数据非常重要。 我们执行文本预处理来准备用于模型…