C++动态规划模板汇总大全

news2024/11/27 12:46:56

前言

如果你不太了解dp(动态规划)是个什么东西,请回到上次dp。

链接:动态规划算法详解

数字三角形模型

问题 A: 【一本通基础DP基础模型】【例9.2】数字金字塔

【题目描述】

观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。

在上面的样例中,从13到8到26到15到24的路径产生了最大的和86。

【输入】

第一个行包含R(1≤ R≤1000),表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

所有的被供应的整数是非负的且不大于100。

【输出】

单独的一行,包含那个可能得到的最大的和。

【输入样例】

5
13
11 8
12 7  26
6  14 15 8
12 7  13 24 11

【输出样例】

86
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int a[MAXN][MAXN], f[MAXN][MAXN], n;
int main() {
    //读入 
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= i; j++)
        {
            cin >> a[i][j];
        }
    }
    //初始化 
    f[1][1] = a[1][1];
    //随时更新f[i][j] 
    for(int i = 2; i <= n; i++) {
        for(int j = 1; j <= i; j++) {
            f[i][j] = max(f[i - 1][j - 1], f[i - 1][j]) + a[i][j];
        }
    }
    int ans = 0;
    //比较ans和f[n][i]
    for(int i = 1; i <= n; i++) {
        ans = max(ans, f[n][i]);
    }
    cout << ans << endl;
    return 0;
} 


最长上升子序列模型

【例9.3】求最长不下降序列

[题目描述]

#include <bits/stdc++.h>
using namespace std;
const int N = 1001;
int a[N], f[N], c[N];
int main() {
    int n, maxx = -23333333;
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    int k;
    for (int i = 1; i <= n; i++) {
        f[i] = 1;
        for (int j = 1; j < i; j++) {
            if (a[j] <= a[i] && f[j] + 1 > f[i])
                f[i] = f[j] + 1;
        }
        if (f[i] > maxx) {
            maxx = f[i];
            k = i;
        }
    }
    int q = 0, m = maxx, i = k - 1;
    c[q++] = k;
    while (m > 1) {
        if (f[i] == m - 1 && a[i] <= a[k]) {
            c[q++] = i;
            k = i;
            m--;
        }
        i--;
    }
    printf("max=%d", maxx);
    cout << endl;
    for (int i = q - 1; i >= 0; i--) printf("%d ", a[c[i]]);
    return 0;
}

背包模型

423. 采药

辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。

为此,他想拜附近最有威望的医师为师。

医师为了判断他的资质,给他出了一个难题。

医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

如果你是辰辰,你能完成这个任务吗?

输入格式

输入文件的第一行有两个整数 T和 M,用一个空格隔开,T代表总共能够用来采药的时间,M 代表山洞里的草药的数目。

接下来的 M 行每行包括两个在 1 到 100 之间(包括 1 和 100)的整数,分别表示采摘某株草药的时间和这株草药的价值。

输出格式

输出文件包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。

数据范围

1≤T≤1000,
1≤M≤100

输入样例:

70 3
71 100
69 1
1 2

输出样例:

3
#include <bits/stdc++.h>
using namespace std;
 
int dp[10010];
int money[101];
int shijian[101];
int t, shumu;
 
int main()
{
    scanf("%d%d", &t, &shumu);
    for(int i = 1; i <= shumu; i++)
    {
        scanf("%d%d", &shijian[i], &money[i]);
    }
    for(int i = 1; i <= shumu; i++)
    {
        for(int j = t; j >= shijian[i]; j--)
        {
            if(dp[j] < dp[j - shijian[i]] + money[i])
            {
                dp[j] = dp[j - shijian[i]] + money[i];
            }
        }
    }
    printf("%d", dp[t]);
    return 0;
}

状态机模型

1049. 大盗阿福

阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。

这条街上一共有 N 家店铺,每家店中都有一些现金。

阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。

作为一向谨慎作案的大盗,阿福不愿意冒着被警察追捕的风险行窃。

他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金?

输入格式

输入的第一行是一个整数 T,表示一共有 T 组数据。

接下来的每组数据,第一行是一个整数 N ,表示一共有 N 家店铺。

第二行是 N 个被空格分开的正整数,表示每一家店铺中的现金数量。

每家店铺中的现金数量均不超过1000。

输出格式

对于每组数据,输出一行。

该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。

数据范围

1≤T≤50
1≤N≤105

输入样例:

2
3
1 8 2
4
10 7 6 14

输出样例:

8
24

样例解释

对于第一组样例,阿福选择第2家店铺行窃,获得的现金数量为8。

对于第二组样例,阿福选择第1和4家店铺行窃,获得的现金数量为10+14=24。

#include <bits/stdc++.h>
using namespace std;
#define read(a) scanf("%d", &a);
const int N = 1e5 + 10, INF = 1e9;
int t, n;
int w[N], f[N][2];
int main() {
	read(t);
	while(t--) {
		read(n);
		for(int i = 1; i <= n; i++) read(w[i]);
		f[0][0] = 0, f[0][1] = -INF;
		for(int i = 1; i <= n; i++) {
			f[i][0] = max(f[i - 1][0], f[i - 1][1]);
			f[i][1] = f[i - 1][0] + w[i];
		}
		printf("%d\n", max(f[n][1], f[n][0]));
	}
	return 0;
}

还有以下内容没有更新,敬请期待:

1.背包模型

2.状态机模型

3.状态压缩DP

4.区间DP

5.树形DP

6.数位DP

7.单调队列优化DP

8.斜率优化DP

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

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

相关文章

【计算机图形学】三维图形投影和消隐(三视图构造)

模块4-1 三维图形投影和消隐 一 实验目的 编写三维图形各种变换的投影算法 二 实验内容 1&#xff1a;自行选择三维物体&#xff08;不能选长方体&#xff09;&#xff0c;建立坐标系&#xff0c;给定点的三维坐标值&#xff0c;建立边表结构。完成三视图。 实验结果如下图所…

如何解决服务器认证失败

服务器认证失败是指在连接服务器时&#xff0c;由于身份认证失败而无法访问服务器。其实这是一种非常常见的问题&#xff0c;这种问题的原因很多&#xff0c;多方面导致的&#xff0c;但是我们又该如何解决这种问题呢&#xff1f;接下来就让小编为大家介绍服务器认证失败的原因…

41.Java单列集合LinkedList

单列集合LinkedList 1.LinkedList集合2.源码3. ArrayList和LinkedList的区别 1.LinkedList集合 在许多情况下&#xff0c;ArrayList效率更高&#xff0c;因为通常需要访问列表中的某一个元素&#xff0c;但是LinkedList提供了几种方法来更有效地执行某些操作。 2.源码 3. Arr…

【Java笔试强训 4】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;计算糖…

Dubbo 的引入(1)

目录 认识RPC Dubbo 认识RPC RPC是解决不同JVM之间数据调用的一个思想&#xff0c;比如说现在有2台不同的机器&#xff0c;业务代码需要在这2台机器间调用后台业务代码&#xff0c;RPC就可以解决这2台机器业务代码调用的问题&#xff1a; 而RPC实现流程是什么样的呢&#xff…

无脑005----在mmyolo框架下复现RTMDet-R

背景 win11系统wsl虚拟机Ubuntu下GTX1060显卡 cuda 10.1 pytorch 1.7.1 python 3.8 耗时 两个小时 参考github链接&#xff1a;https://github.com/open-mmlab/mmyolo 1.安装环境 首先安装pytorch conda install pytorch1.7.1 torchvision0.8.2 torchaudio0.7.2 cudatoolkit…

最新发布!面向开发者的 ChatGPT Prompt Engineering 免费教程,吴恩达与OpenAI合作打造!...

就在几小时之前&#xff0c;吴恩达在Twitter上宣布了与OpenAI合作的最新免费教程&#xff1a;《ChatGPT Prompt Engineering for Developers》 我们可以通过下面的链接&#xff0c;直达官网网站&#xff1a; https://www.deeplearning.ai/short-courses/chatgpt-prompt-enginee…

当下常见的企业文件管理工具都有哪些?

随着数字化的发展&#xff0c;企业在日常办公中会产出大量文件&#xff0c;高效管理办公文件十分重要。当下常见文件管理工具都有哪些呢&#xff1f; 1.Zoho WorkDrive 高性价比&#xff0c;多设备支持&#xff0c;安全性能高。Zoho Workdive 是一个团队协作多人内容编辑平台&…

“递归三要素”寻踪(浅析递归“经典”框架,领略递归优雅秀气;看到有“递归算法优化”的操作,余试剖之)

浅析递归“经典”框架&#xff0c;领略递归优雅秀气。看到有“递归算法优化”的操作&#xff0c;余试剖之。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是…

mulesoft MCIA 破釜沉舟备考 2023.04.29.27 (易错题)

mulesoft MCIA 破釜沉舟备考 2023.04.29.27 (易错题) 1. An insurance company has an existing API which is currently used by customers.2. An organization has deployed both Mule and non-Mule API implementations to integrate its customer and order management s…

《2023中国各地区科创之星势力图1.0版》重磅发布

数据猿出品 本次“数据猿2023年度三大媒体策划活动——《2023中国各地区科创之星势力图1.版》”的发布&#xff0c;是数据猿在2022年3.0版本的基础上&#xff0c;迭代升级的2023开年的第一个版本。本年度下一次版本迭代将于2023年8月底发布2023年2.0版&#xff0c;敬请期待&…

51 - 自写操作系统

简易OS 1> 版本1&#xff1a;任务建立与切换2> 版本2&#xff1a;定时器切换2.1> main.c2.2> task.c2.3> sleep.c 3> 版本3&#xff1a;加时间片轮转 &#x1f517; //--------- 参考视频链接 ------// 通过实验&#xff0c; 学习理解操作系统的大概&#xf…

【MySQL入门指南】外键约束使用详解

一、为什么需要外键&#xff1f; MySQL是一种关系型数据库&#xff0c;现实中的业务往往是相互关联的&#xff0c;这也就决定了数据库中的表也是存在相互关系的。而表与表之间的相互关系就是通过外键来维护的。给大家举一个现实的例子来帮助理解&#xff1a; 现在我们需要在数据…

IPsec中IKE与ISAKMP过程分析(主模式-消息1)

IPsec协议族中IKE&#xff08;Internet Key Exchange&#xff09;是一种基于ISAKMP的协议&#xff0c;它为建立IPSec安全通信隧道提供了一种无痕密钥交换的机制。简单来说&#xff0c;IKE就是ISAKMP的扩展&#xff0c;为ISAKMP提供了更加高效、灵活和安全的密钥协商机制。 GMT …

什么是大数据?如何入门学习大数据?

什么是大数据&#xff1f;在互联网技术快速发展的今天&#xff0c;大量日常生活和经营活动中产生的数据都已经信息化。我们产生的数据量相比以前有了爆炸式的增长&#xff0c;传统的数据处理技术已经无法胜任&#xff0c;需求催生技术&#xff0c;一套用来处理海量数据的软件工…

TCP报文结构以及三次握手以及四次握手

源端口号: 目标端口号:用来标识接收方计算机的具体应用进程 序号&#xff1a;发送数据组的第一个字节的序号。在TCP传送的流中&#xff0c;每一个字节一个序号。例如&#xff1a;一个报文段的序号为300&#xff0c;此报文段数据部分共有100字节&#xff0c;则下一个报文段的序…

vmware安装redhat 8

vmware安装redhat 8 1、下载镜像文件1.1 镜像文件 2、安装系统2.1、选择自定义安装2.2、兼容性选择2.3、选择镜像文件导入2.4、设置用户名密码2.5、选择虚拟机在磁盘上的位置2.6、选择处理器数量2.7、选择内存大小2.8、选择桥接或NAT2.9、选择SCSI控制器类型2.10、选择虚拟机磁…

第十二章 Transform组件(下)

上一章节中我们介绍了Transform组件的属性和方法。我们发现 Transform 中有right&#xff0c;up和forward&#xff0c;而 Vector3 类中也有right&#xff0c;up和forward&#xff0c;他们是一回事嘛&#xff1f;我们使用Forward来说明两者之间的区别。我们知道&#xff0c;改变…

【web基础】html常用标签+作品展示

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 说明&#xff1a;此部分是java web基础知识&a…

Python游戏利器pygame,疯狂赛车(34)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 你玩过游戏吗&#xff1f; 你喜欢玩游戏吗&#xff1f; 手机游戏&#xff0c;电脑游戏&#xff0c;还是游戏机游戏…