首页 > 其他分享 >动态规划(一)—— 基本工具(上)第一章节之动态规划的基础(下:多维)

动态规划(一)—— 基本工具(上)第一章节之动态规划的基础(下:多维)

时间:2024-11-23 19:29:55浏览次数:10  
标签:200 return int MAX dfs 2000 多维 动态 规划

例题扩展及讲解

T1

n × m n\times m n×m 的方格( n , m ≤ 2000 n,m\le 2000 n,m≤2000),第 i i i 行第 j j j 个格子的值是 a i , j a_{i,j} ai,j​。现在从第 1 1 1 行第 1 1 1 个格子出发,每一步都可以向下或向右移动一格,直到走到第 n n n 行第 m m m 个格子。问经过的格子总和最大是多少。

想想对于方格来说的一维状态?或许压维或滚动数组能做到,但从基础来说,似乎只能定义二维的状态,而这便是今天的主题。其实,二维和一维定义从本质上来说没什么区别,思考一下,是不是只需要更新走到这一格的最优解?我们想想,是不是从第一次到它就一定是最优解?是的,因为不会第二次走到它。而我们只可能从上面一个和左边一个的格子转移过来,那么得:

  • 状态定义及目标函数: f ( i , j ) f(i,j) f(i,j) 表示从 ( 1 , 1 ) (1,1) (1,1) 走到 ( i , j ) (i,j) (i,j) 的最大值。
  • 状态转移: f ( i , j ) = m a x { f ( i − 1 , j ) , f ( i , j − 1 ) } + a i , j f(i,j)=max\{f(i-1,j),f(i,j-1)\}+a_{i,j} f(i,j)=max{f(i−1,j),f(i,j−1)}+ai,j​
  • 边界: f ( i , j ) = 0 , i ∈ [ 0 … n ] , j ∈ [ 0 … m ] f(i,j)=0,i\in[0\dots n],j\in[0\dots m] f(i,j)=0,i∈[0…n],j∈[0…m]
  • 时间复杂度: Θ ( n m ) \Theta(nm) Θ(nm)
  • 答案: f ( n , m ) f(n,m) f(n,m)

代码

#include <bits/stdc++.h>
using namespace std;
int a[2100][2100];

int dfs(int x, int y) {
	if (x == 1 && y == 1) {
		return a[x][y];
	}
	if (x == 1) {
		return dfs(x, y - 1) + a[x][y];
	}
	if (y == 1) {
		return dfs(x - 1, y) + a[x][y];
	}
	return max(dfs(x - 1, y), dfs(x, y - 1)) + a[x][y];
}

int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> a[i][j];
		}
	}
	cout << dfs(n, m);
	return 0;
}

这便是二维方格取数,这种取数问题可以扩展到图上,或是多维情况下,咱们再来一道模型题。

T2

你有一个载重量最大为 M M M 的背包,现在有 n n n个物品,重量分别为 m 1 , m 2 , … , m n m_{1},m_{2},\ldots,m_{n} m1​,m2​,…,mn​,价值分别为 v 1 , v 2 , … , v n v_{1},v_{2},\ldots,v_{n} v1​,v2​,…,vn​,现要你装入一些物品,使得在重量不超过 M M M 的情况下,价值尽可能大,求这个最大价值。

作者太懒了,直接上代码!

#include <cstdio>

const int MAX_N = 110;
const int MAX_M = 10011;
const int INF = 1000;
int v[MAX_N], m[MAX_N], f[MAX_M][MAX_N];
int main() {
	int n, M;
	scanf("%d%d", &n, &M);
	for (int i = 1; i <= n; i++) {
		scanf("%d%d", &m[i], &v[i]);
	}

	for(int i = 0; i <= M; i++)
		f[i][0] = 0;
	f[0][0] = 0;
	
	for(int i = 0; i <= M; i++){
		for(int j = 1; j <= n; j++){
			f[i][j] = f[i][j - 1];
			if(m[j]<=i&&f[i][j] < f[i - m[j]][j-1] + v[j])
				f[i][j] = f[i - m[j]][j-1] + v[j];
		}
	}

	printf("%d\n", f[M][n]);
	return 0;
}

自己理解,有更多的收获,背包问题的扩展极多, 01 01 01背包也是起源,我也会陆续更新。

思考题讲解

给定一个有 n n n ( ≤ 200 \leq 200 ≤200)个正整数的数组 { a 1 , a 2 , … , a n } \{ a_{1},a_{2},\ldots,a_{n}\} {a1​,a2​,…,an​}( a i ≤ 200 a_{i} \leq 200 ai​≤200) 和一个整数 M M M ,求选择数组中部分数字,和为 M M M 的方案数。 当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。在这里插入图片描述

思考题

你有一个容量为 m m m( ≤ 5000 \le 5000 ≤5000)的背包,现在有 n n n( ≤ 2000 \le 2000 ≤2000) 种物品,重量分别为非负整数 w 1 , w 2 , … , w n w_1,w_2,\dots,w_n w1​,w2​,…,wn​,价值分别为 v 1 , v 2 , … , v n v_1,v_2,\dots,v_n v1​,v2​,…,vn​(可能为负)。现要你装入一些物品,每种物品可以放多个,使得在重量恰好等于 m m m 的情况下,价值尽可能大。如果无解输出 no solution

最后,希望各位大佬关注一下。

标签:200,return,int,MAX,dfs,2000,多维,动态,规划
From: https://blog.csdn.net/2301_79267246/article/details/143995633

相关文章

  • 使用ENSP实现DHCP+动态路由
    一、项目拓扑   二、项目实现 (1)路由器AR1配置进入系统试图sys将路由器命名为R1sysnameR1关闭信息中心undoinfo-centerenable进入g0/0/0接口intg0/0/0将g0/0/0接口IP地址配置为12.12.12.1/30ipaddress12.12.12.130退出此视图quit创建valn......
  • YOLOv11改进策略【Head】| 结合CVPR-2024 中的DynamicConv 动态卷积 改进检测头, 优化
    一、本文介绍本文记录的是利用DynamicConv优化YOLOv11的目标检测网络模型。在大规模训练中,模型的参数量越多,FLOPs也越高,但在一些对计算资源有限制的场景下,需要低FLOPs的模型同时又希望模型能从大规模预训练中受益。传统的方法很难在增加参数的同时保持低FLOPs,因此Dynamic......
  • flutter 专题十二 Flutter Fair逻辑动态化架构设计与实现
    数据逻辑处理布局中的逻辑处理Flutter类型数据处理一、数据逻辑处理我们接触的每一个Flutter界面,大多由布局和逻辑相关的代码组成。如Flutter初始工程的CountingDemo的代码:class_MyHomePageStateextendsState<MyHomePage>{//变量int_counter=0;//......
  • 深圳大学-算法设计与分析-实验4-动态规划(鸡蛋掉落问题)
    前言说明一门没什么意义的课程,学算法不如直接刷题,这门课纯答辩,本人写的报告也很答辩,可能还有错误,仅供参考,慎抄!实验目的(1)掌握动态规划算法设计思想。(2)掌握鸡蛋坠落问题的动态规划解法。实验内容动态规划将问题划分为更小的子问题,通过子问题的最优解来重构原问题的最......
  • 动态 DP 学习笔记
    1前言动态DP,简称DDP。用于处理树上带修的简单DP问题。前置知识:树链剖分线段树维护矩阵树形DP2基本做法上模板题:P4719【模板】"动态DP"&动态树分治如果不带修,就是简单的树上DP。设\(f_{i,0}\)表示不选\(i\)点的最大权值,\(f_{i,1}\)表示选\(i\)点并且......
  • 大学最后一年的学习规划与思考
    前三学年我的大学前三年其实是充满迷茫和犹豫的。虽然是计算机科班,但看着周围同学刷绩点的刷绩点,实习的实习,考研的考研,而我尚且不知道方向,说实话不焦虑是不可能的。我有读研深造的想法,但是大学前两年实在内耗,被知乎上的主流观点“国内教材大多是shit,要学习国外优秀课程与教材......
  • element-pluls中的动态el-menu中遇到的问题
    问题一:点击菜单路由没效果el-menu中添加  router<el-menuactive-text-color="#f9cc4b"text-color="white"background-color="#63779c"class="el-menu-vertical-demo"router:collapse="isCollapse"......
  • Drools与动态加载规则文件
    Drools简介Drools是一款基于Java的开源规则引擎,将规则与业务代码解耦。规则以脚本的形式存储在一个文件中,使规则的变化不需要修改代码,重新启动机器即可在线上环境中生效。规则引擎实现了业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入、解释......
  • Vue 2 全功能表单开发:账单提交页面完整实现 从零开始用 Vue 2 打造多功能账单管理系统
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title>账单提交系统</title><scriptsrc="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><style>body{font......
  • c语言:动态内存管理中的malloc和free,calloc和realloc
    为什么要有动态内存分配?通过之前的学习,我们已经掌握的内存开辟方式有:inta=20;//在栈空间上开辟四个字节chararr[10]={0};//在栈空间上开辟10个字节的连续空间上述空间的开辟的大小是固定的数组在申明的时候,必须指定数组的长度,数组空间一旦确定了大小不能进行调整。......