算法刷题day10

目录

  • 引言
  • 一、最长上升子序列
  • 二、地宫取宝
  • 三、波动数列

引言

今天是大年三十,提前祝大家新的一年天天开心,事事如意,过年把身体精神修养好后,年后继续朝着目标奋斗,然后加油吧!


一、最长上升子序列

标签:简单 DP

思路:枚举每个a[i],再枚举判断过的,如果a[i] > a[j],那么找到最大的f[j]+1与当前的f[i]比较,最后寻找到最大的以i结尾的最长上升子序列

题目描述:

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式
第一行包含整数 N。第二行包含 N 个整数,表示完整序列。输出格式
输出一个整数,表示最大长度。数据范围
1≤N≤1000,−109≤数列中的数≤109
输入样例:
7
3 1 2 1 8 5 6
输出样例:
4

示例代码:

#include <cstdio>
#include <iostream>using namespace std;const int N = 1010;int n;
int a[N], f[N];int main()
{cin >> n;for(int i = 1; i <= n; ++i) cin >> a[i];for(int i = 1; i <= n; ++i){f[i] = 1;for(int j = 1; j < i; ++j){if(a[i] > a[j]) f[i] = max(f[i], f[j] + 1);}}int res = 0;for(int i = 1; i <= n; ++i) res = max(res, f[i]);cout << res << endl;return 0;
}

二、地宫取宝

标签:DP

思路:首先要确定状态表示 f [ i ] [ j ] [ c n t ] [ k ] f[i][j][cnt][k] f[i][j][cnt][k]表示下标为 [ i , j ] [i,j] [i,j],取了 c n t cnt cnt个,最大价值为 k k k的所以集合的数量,然后状态可以划分为取 a [ i ] [ j ] a[i][j] a[i][j]的物品和不取 a [ i ] [ j ] a[i][j] a[i][j]的物品(需要 k = = a [ i ] [ j ] k == a[i][j] k==a[i][j]),状态方程分别为
f [ i ] [ j ] [ c n t ] [ k ] = ( f [ i ] [ j ] [ c n t ] [ k ] + f [ i − 1 ] [ j ] [ c n t ] [ k ] + f [ i ] [ j − 1 ] [ c n t ] [ k ] ) f[i][j][cnt][k] = (f[i][j][cnt][k] + f[i-1][j][cnt][k] + f[i][j-1][cnt][k]) f[i][j][cnt][k]=(f[i][j][cnt][k]+f[i1][j][cnt][k]+f[i][j1][cnt][k])
f [ i ] [ j ] [ c n t ] [ k ] = ( f [ i ] [ j ] [ c n t ] [ k ] + f [ i − 1 ] [ j ] [ c n t − 1 ] [ k ] + f [ i ] [ j − 1 ] [ c n t − 1 ] [ k ] ) ( k = 0 , 1 , 2 , . . . k − 1 ) f[i][j][cnt][k] = (f[i][j][cnt][k] + f[i-1][j][cnt-1][k] + f[i][j-1][cnt-1][k]) (k = 0,1,2,...k-1) f[i][j][cnt][k]=(f[i][j][cnt][k]+f[i1][j][cnt1][k]+f[i][j1][cnt1][k])(k=0,1,2,...k1)

题目描述:

X 国王有一个地宫宝库,是 n×m 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。地宫的入口在左上角,出口在右下角。小明被带到地宫的入口,国王要求他只能向右或向下行走。走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。当小明走到出口时,如果他手中的宝贝恰好是 k 件,则这些宝贝就可以送给小明。请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这 k 件宝贝。输入格式
第一行 3 个整数,n,m,k,含义见题目描述。接下来 n 行,每行有 m 个整数 Ci 用来描述宝库矩阵每个格子的宝贝价值。输出格式
输出一个整数,表示正好取 k 个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。数据范围
1≤n,m≤50,1≤k≤12,0≤Ci≤12
输入样例1:
2 2 2
1 2
2 1
输出样例1:
2
输入样例2:
2 3 2
1 2 3
2 1 5
输出样例2:
14````示例代码:````cpp
#include <cstdio>
#include <iostream>using namespace std;typedef long long LL;const int N = 55, MOD = 1000000007;int n, m, k;
int a[N][N];
int f[N][N][13][14];int main()
{cin >> n >> m >> k;for(int i = 1; i <= n; ++i){for(int j = 1; j <= m; ++j){cin >> a[i][j];a[i][j]++;}}f[1][1][0][0] = 1;f[1][1][1][a[1][1]] = 1;for(int i = 1; i <= n; ++i){for(int j = 1; j <= m; ++j){for(int cnt = 0; cnt <= k; ++cnt){for(int k = 0; k < 14; ++k){f[i][j][cnt][k] = (f[i][j][cnt][k] + f[i-1][j][cnt][k]) % MOD;f[i][j][cnt][k] = (f[i][j][cnt][k] + f[i][j-1][cnt][k]) % MOD;if(cnt && k == a[i][j]){for(int s = 0; s < a[i][j]; ++s){f[i][j][cnt][k] = (f[i][j][cnt][k] + f[i-1][j][cnt-1][s]) % MOD;f[i][j][cnt][k] = (f[i][j][cnt][k] + f[i][j-1][cnt-1][s]) % MOD;}}}}}}LL res = 0;for(int i = 1; i <= 14; ++i) res = (res + f[n][m][k][i]) % MOD;cout << res << endl;return 0;
}

三、波动数列

标签:DP

思路:这道题虽然看了讲解视频,敲了代码,但其实还是不是很懂。大概就是:状态表示为f[i][j],为前i项,当前的总和除以n的余数是j的方案数的总和数,然后就推出一个方程
f [ i ] [ j ] = f [ i − 1 ] [ j − a ∗ ( n − i ) ] + f [ i − 1 ] [ j + b ∗ ( n − i ) ] f[i][j]=f[i-1][j-a*(n-i)]+f[i-1][j+b*(n-i)] f[i][j]=f[i1][ja(ni)]+f[i1][j+b(ni)]然后就递推就完了。

题目描述:

观察这个数列:1 3 0 2 -1 1 -2 …这个数列中后一项总是比前一项增加2或者减少3,且每一项都为整数。栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加 a 或者减少 b 的整数数列可能有多少种呢?输入格式
共一行,包含四个整数 n,s,a,b,含义如前面所述。输出格式
共一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方案数除以 100000007 的余数。数据范围
1≤n≤1000,−109≤s≤109,1≤a,b≤106
输入样例:
4 10 2 3
输出样例:
2
样例解释
两个满足条件的数列分别是2 4 1 3和7 4 1 -2。

示例代码:

#include <iostream>using namespace std;const int N = 1010, MOD = 100000007;int n, s, a, b;
int f[N][N];  // 前i项总和余数为j的方案数int get_mod(int a, int b)
{return (a % b + b) % b;
}int main()
{cin >> n >> s >> a >> b;f[0][0] = 1;for(int i = 1; i < n; ++i){for(int j = 0; j < n; ++j){f[i][j] = (f[i-1][get_mod(j - a * (n - i),n)] + f[i-1][get_mod(j + b * (n - i),n)]) % MOD;}}cout << f[n-1][get_mod(s,n)] << endl;return 0;
}

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

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

相关文章

Android截屏方法

// 截屏方法private void getSnapshot() {wView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));wView.layout(0, 0, wView.getMeasuredWidth(), wView.getMeasuredHeight(…

U3D记录之FBX纹理丢失问题

今天费老大劲从blender建了个模型&#xff0c;然后导出进去unity 发现贴图丢失 上网查了一下 首先blender导出要改设置 这个path mode要copy 然后unity加载纹理也要改设置 这里这个模型的纹理load要改成external那个模式 然后就有了&#xff0c;另外这个导出还有好多选项可…

Python判断列表A中是否有元素出现在了列表B中

目录 1. 问题重述2. 问题求解2.1 暴力法2.2 哈希表法2.3 集合法 3. 总结 1. 问题重述 给定两个列表 A A A 和 B B B&#xff0c;它们的长度分别为 n n n 和 m m m。我们要检查的是&#xff0c;是否存在 x ∈ A x\in A x∈A&#xff0c;使得 x ∈ B x\in B x∈B。 以下介…

Java项目maven打包的包名设置(finalname标签的使用)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

C#用Array类的Reverse方法反转数组中元素

目录 一、Array.Reverse 方法 1.重载 2.Reverse(Array, Int32, Int32) 3. Reverse(Array) 4.Reverse(T[]) 5. Reverse(T[], Int32, Int32) 二、实例 1.Array.Reverse 方法4种重载方法综合实例 2.Reverse(Array)方法的实例 一、Array.Reverse 方法 反转一维 Array 或部…

wireshark分析数据包:追踪流

打开追踪流的界面 方法 1 方法 2 选中数据包&#xff0c;右键弹出菜单 说明&#xff1a; 流内容的显示顺序和它在网络上出现的顺序相同。不可打印的字符被点代替。从客户端到服务器的流量被标记为红色&#xff0c;而从服务器到客户端的流量被标记为蓝色。这些颜色可以通过下…

numpy基础之transpose

1 numpy基础之transpose 用法 ndarray.transpose(*axes)描述 根据axes将ndarray数组进行转置。 入参 axes&#xff1a;可选&#xff0c;元组或列表。若指定&#xff0c;则元素个数必须为数组轴大小(ndarray.ndim)&#xff0c;元素值的范围为[0,1,2,…,ndarray.ndim-1]&…

Python(22)正则表达式中的“限定符”

大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 获取资源&#xff1a;公众号回复“python资料” 限定符功能?匹配前面的字符0次或1次匹配前面的字符1次或多次*匹配前面的字符0次或多次{n…

R语言rmarkdown使用

1、安装 install.packages(rmarkdown) library(rmarkdown) install.packages(tinytex) tinytex::install_tinytex() 2、新建R Markdown 3、基本框架 红色框内为YAML&#xff1a;包括标题、作者和日期等 黄色框内为代码块&#xff1a;执行后面的代码&#xff0c;并可以设置展…

适用于 Windows 的 6 款 iPhone 数据恢复软件

数据恢复 已经取得了长足的进步。从仅提供恢复数据的可能性到保证数据恢复&#xff0c;有许多适用于 Windows的第三方 iPhone 数据恢复软件。 大多数软件都是高级工具&#xff0c;但是提供了出色的数据恢复解决方案。从iPhone恢复数据非常简单。 只需将 iPhone 连接到您的计算…

11 串口发送应用之使用状态机实现多字节数据发送

1. 使用串口发送5个字节数据到电脑 uart协议规定&#xff0c;发送的数据位只能是6&#xff0c;7&#xff0c;8位&#xff0c;如果数据位不符合&#xff0c;接收者接收不到数据。所以我们需要将40位数据data分为5个字节数据分别发送&#xff0c;那么接收者就能通过uart协议接收…

开源的直播平台

​​​​​​直播平台系统界面介绍 开源一套直播平台 私信可获取源码

C语言使⽤ scanf()函数应注意的问题是什么?

一、问题 scanf()函数的基本格式和格式符&#xff0c;在使⽤时应注意什么问题呢&#xff1f; 二、解答 那么具体该注意哪些问题呢&#xff1f;下⾯来看⼀下⽐较常见的⼀些错误。 1、不能控制精度 与 printf()函数不同&#xff0c;scanf()函数输⼊实数时&#xff0c;是不能控制…

qt/c++实现拓扑排序可视化

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 实现功能 1、选择文件导入初始数据 2、逐步演示 3、排序完成输出…

多线程基础详解(看到就是赚到)

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 创建线程 1.创建类继承Thread,重写run() 2.实现Runnable,重写run() 3.继承Thread,使用匿名内部类 …

问题:A注册会计师必须在期中实施实质性程序的情形是()。 #学习方法#其他

问题&#xff1a;A注册会计师必须在期中实施实质性程序的情形是&#xff08;&#xff09;。 A&#xff0e;甲公司整体控制环境不佳 B&#xff0e;将期中实质性程序所获证据与期末数据进行比较 C&#xff0e;评估的认定层次重大错报风险很高 D&#xff0e;没有把握通过在期中…

Linux 36.2@Jetson Orin Nano基础环境构建

Linux 36.2Jetson Orin Nano基础环境构建 1. 源由2. 步骤2.1 安装NVIDIA Jetson Linux 36.2系统2.2 必备软件安装2.3 基本远程环境2.3.1 远程ssh登录2.3.2 samba局域网2.3.3 VNC远程登录 2.4 开发环境安装 3. 总结 1. 源由 现在流行什么&#xff0c;也跟风来么一个一篇。当然&…

C++自定义函数详解

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 铁汁们新年好呀&#xff0c;今天我们来了解自定义函数。 文章目录 1.数学中的函数 2.什么是自定义函数 3.自定义函数如何使用&#xff1f; 4.值传递和引用传递&#xff08;形参和实参区分&#xff09; …

Spring Boot项目Jar包加密:防止反编译的安全实践

文章目录 1. 引言2. 背景3. Jar包加密方案3.1 使用Java混淆工具3.2 使用Jar包加密工具3.2.1 示例&#xff1a;使用JCryptor对Jar包进行加密 4. 加密后的Jar包的运行5. 安全性与性能考虑5.1 安全性考虑5.2 性能考虑 6. 拓展功能与未来展望6.1 数字签名与验签6.2 使用加密算法库 …

代码随想录算法训练营第四十五天(动态规划篇)|01背包

01背包理论基础 学习资料&#xff1a;代码随想录 (programmercarl.com) 相关链接&#xff1a;题目页面 (kamacoder.com) 背包题目分类 01背包定义 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次…