动态规划入门第1课

        1、从计数到选择 ---- 递推与DP(动态规划)

        2、从递归到记忆 ---- 子问题与去重复运算

        3、动态规划的要点

第1题     网格路1(grid1)

        

小x住在左下角(0,0)处,小y在右上角(n,n)处。小x需要通过一段网格路才能到小y家。每次,小x可以选择下面任意一个方向前进:

  • 右方:从(x,y)到点(x+1,y);

  • 上方:从(x,y)到点(x,y+1);

  • 右上方:从(x,y)到点(x+1,y+1)。

问小x有多少种走法到达小y家。

输入格式

一行,一个整数n。1 ≤ n ≤ 500

输出格式

你的答案除以1 000 000 007的余数。

输入/输出例子1

输入:

2

输出:

13

样例解释

代码奉上:

#include<bits/stdc++.h>
using namespace std;
long long n;
long long f[505][505];
const long long mod=1000000007;
int main(){scanf("%lld",&n);n+=1; 				//题目中是(0,0)到(n,n),我为了防止数组越界,要+1,也会方便很多。f[0][0]=1; 			//初始化。for(long long i=1;i<=n;i++) for(long long j=1;j<=n;j++)f[i][j]=(f[i-1][j-1]%mod+f[i-1][j]%mod+f[i][j-1]%mod)%mod; //动态转移方程。printf("%d\n",f[n][n]%mod); return 0;
} 

小问题推导大问题 ------ 子问题概念

 

  • 测试2 

第1题     好的序列(seq) 

一个长为k的序列b1, b2, ..., bk (1 ≤ b1 ≤ b2 ≤ ... ≤ bk ≤ n),如果对所有的 i (1 ≤ i ≤ k - 1),满足bi | bi+1,那么它就是好的序列。这里a | b表示a是b的因子,或者说a能整除b。

给出n和k,求长度为k的好的序列有多少个。

输入格式

一行,两个整数n,k。1 ≤ n,k ≤ 2000

输出格式

你的答案除以1 000 000 007的余数。

输入/输出例子1

输入:

3 2

输出:

5

样例说明

[1, 1], [2, 2], [3, 3], [1, 2], [1, 3]。

样例解释

代码奉上:

#include<cstdio>
#include<iostream>
#define rr register
using namespace std;
int cwh=1000000007,n,k,f[2005][2005],ans;//用cwh表示1000000007更方便。
int main()
{scanf("%d%d",&n,&k);for(rr int i=1;i<=n;i++)f[1][i]=1;//赋值for(rr int i=1;i<=k;i++)//长度for(rr int j=n;j>0;j--)for(rr int k=1;k<=n/j;k++)//倍数f[i][j*k]=(f[i][j*k]+f[i-1][j])%cwh;//方程for(rr int i=1;i<=n;i++)ans=(ans+f[k][i])%cwh;//求答案printf("%d",ans);return 0;
}

小问题推导大问题

两个方向:改进后面;从前面得到;

 

  • 测试3 

第1题     卡牌游戏(card) 

有三种卡牌,记为A,B,C类型。每轮,小x可以选择的出牌方法有:

  • 打出一张A牌;

  • 打出一张B牌;

  • 打出一张A牌和一张C牌;

  • 打出两张B牌和三张C牌。

问小x有多少种方法出完所有的牌。只要有一轮出牌的方法不一样,就算作不同的方法。

输入格式

一行,三个整数a,b,c,依次表示卡牌A,B,C的数量。1 ≤ a,b,c ≤ 15

输出格式

你的答案除以1 000 000 007的余数。

输入/输出例子1

输入:

2 2 3

输出:

3

样例解释

代码奉上:

#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int f[55][55][55];
const int mod=1000000007;
int main(){cin>>a>>b>>c;f[0][0][0]=1; 			for(int i=0;i<=a;i++){for(int j=0;j<=b;j++){for(int k=0;k<=c;k++){		//枚举A,B,C卡牌的数量if(i>=1){f[i][j][k]+=f[i-1][j][k];f[i][j][k]%=mod;}	//DP,记得特判,不然会越界。下同。if(j>=1){f[i][j][k]+=f[i][j-1][k]%mod;f[i][j][k]%=mod;}if(i>=1 && k>=1){f[i][j][k]+=f[i-1][j][k-1]%mod;f[i][j][k]%=mod;}if(j>=2 && k>=3){f[i][j][k]+=f[i][j-2][k-3]%mod;f[i][j][k]%=mod;}}}}cout<<f[a][b][c]%mod<<endl;return 0;
}

大问题分解为小问题  ------ 状态概念

小问题推导出大问题  -------  计算方法;方程 

f[ a ][ b ][ c ] =?

  • 测试4 

第1题     四面体(tetra) 

一只蚂蚁从点A出发,每次行动可沿四面体的边来到另外一个点。问n次行动后,蚂蚁回到点A有多少种方法。

输入格式

一行,一个整数n。1 ≤ n ≤ 10^6

输出格式

你的答案除以1 000 000 007的余数。

输入/输出例子1

输入:

2

输出:

3

样例解释

代码奉上:

#include<bits/stdc++.h>
using namespace std;
long long n;
long long f[1000000][6];
const long long mod=1000000007;
int main(){scanf("%lld",&n);f[0][1]=1;for(int i=1;i<=n;i++){f[i][1]=(f[i-1][2]%mod+f[i-1][3]%mod+f[i-1][4]%mod)%mod;f[i][2]=(f[i-1][1]%mod+f[i-1][3]%mod+f[i-1][4]%mod)%mod;f[i][3]=(f[i-1][2]%mod+f[i-1][1]%mod+f[i-1][4]%mod)%mod;f[i][4]=(f[i-1][2]%mod+f[i-1][3]%mod+f[i-1][1]%mod)%mod;}printf("%d\n",f[n][1]);return 0;
}

状态与阶段

 

  • 测试5
  • 第1题     网格取数1 

有N*M的方格,每个方格里面有一个数字。你从左上角开始出发,每次可以进入右边一个方格或下面一个方格,不准出界。

问你选择怎样的线路到达右下角时,线路上的数字和最大?

例如下面是一个4*3的方格,最优的路线如图所示:

 

输入格式

   第1行:2个正整数N和M,范围[2,100]。

   下面N行,每行M个整数,每个整数范围[-100,100]

输出格式

  一个整数。

输入/输出例子1

输入:

3 3

1 2 3

4 5 6

9 9 9

输出:

32

样例解释

代码奉上:

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[1005][1005],b[1005][1005];
int main(){cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(i==1&&j==1)b[i][j]=a[i][j];else if(i==1)b[i][j]=b[i][j-1]+a[i][j];else if(j==1)b[i][j]=b[i-1][j]+a[i][j];else b[i][j]=(b[i-1][j]>b[i][j-1])?b[i-1][j]+a[i][j]:b[i][j-1]+a[i][j];}}cout<<b[n][m];return 0;
}

 总结:

 

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

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

相关文章

macOS mysql 8.0 忘记密码

╰─➤ mysql -V mysql Ver 8.0.33 for macos13.3 on arm64 (Homebrew)mysql.server status mysql.server stopskip-grant-tables 启动mysql ─➤ /opt…

云计算和云架构是什么 有什么用途?

云计算是一种基于互联网的计算方式&#xff0c;它通过网络将计算资源(如计算能力、存储、网络带宽等)以服务的形式提供给用户&#xff0c;并允许用户根据需求进行灵活的资源调配和管理。云计算通常分为三个层次&#xff0c;即基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服…

MongoDB常用语句

MongoDB常用语句 使用创建和删除查询条件查询模糊查询分页排序聚合两表连接 插入 使用 展示数据库 show dbs 或 show databases 查看当前在使用的数据库 db展示数据库下所有表 show collections 或 show tables;终端内容过多&#xff0c;用该指令清屏 cls创建和删除 如果…

[SQL挖掘机] - 比较运算符

介绍: 在 sql 中&#xff0c;比较运算符用于比较表达式或值之间的关系&#xff0c;并生成逻辑真&#xff08;true&#xff09;或逻辑假&#xff08;false&#xff09;的结果。比较运算符在 sql 查询中扮演着重要的角色&#xff0c;具有以下作用和地位&#xff1a; 条件筛选&a…

【Matlab】基于径向基神经网络的数据回归预测(Excel可直接替换数据)

【Matlab】基于径向基神经网络的数据回归预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码6.完整代码7.运行结果1.模型原理 基于径向基神经网络(Radial Basis Function Neural Network,RBFNN)的数据回归预测是一种基于神经网络的回归模型…

【Matlab】基于遗传算法优化 BP 神经网络的时间序列预测(Excel可直接替换数据)

【Matlab】基于遗传算法优化 BP 神经网络的时间序列预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.文件结构3.Excel数据4.分块代码4.1 arithXover.m4.2 delta.m4.3 ga.m4.4 gabpEval.m4.5 initializega.m4.6 maxGenTerm.m4.7 nonUnifMutation.m4.8 normGeomSel…

使用Redis实现双平面部署的最佳实践

引言&#xff1a; 双平面部署是一种常见的系统架构模式&#xff0c;用于提高系统的可靠性和性能。在这种架构中&#xff0c;拥有相同功能的两个平面同时运行&#xff0c;其中一个平面作为主平面处理请求&#xff0c;而另一个平面则作为备份平面。在传统的双平面部署中&#xf…

操作系统笔记、面试八股(三)—— 系统调用与内存管理

文章目录 3. 系统调用3.1 用户态与内核态3.2 系统调用分类3.3 如何从用户态切换到内核态&#xff08;系统调用举例&#xff09; 4. 内存管理4.1 内存管理是做什么的4.1.1 为什么需要虚拟地址空间4.1.2 使用虚拟地址访问内存有什么优势 4.2 常见的内存管理机制4.3 分页管理4.3.1…

Android-WebRTC-实现摄像头显示

EglBase是什么&#xff1f; 它提供了一个接口&#xff0c;用于在Android平台上创建和管理EGL&#xff08;嵌入式系统图形库&#xff09;上下文&#xff0c;以便在WebRTC中进行图像和视频的处理和渲染。 Capturer, Source, Track, Sink分别是什么&#xff1f; Capturer&#xff…

2023C语言暑假作业day3

1 选择题 1 已知函数的原型是&#xff1a; int fun(char b[10], int a); &#xff0c;设定义&#xff1a; char c[10];int d; &#xff0c;正确的调用语句是 A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d); 答案解析&#xff1a; 正确答案&#x…

kettle开发-Day40-AI分流之case/switch

前言&#xff1a; 前面我们讲到了很多关于数据流的AI方面的介绍&#xff0c;包括自定义组件和算力提升这块的&#xff0c;今天我们来学习一个关于kettle数据分流处理非常重要的组件Switch / Case 。当我们的数据来源于类似日志、csv文件等半结构化数据时&#xff0c;我们需要在…

Vmware+CentOS+KGDB内核双机调试

1.准备两台CentOS系统的vmware虚拟机 其中一台作为调试机&#xff0c;另一台则作为被调试机。如下图&#xff0c;CentOS7.9x64为被调试机&#xff0c;CentOS7.9x64-Debugger为调试机 2.配置串口设备 若虚拟机有串口设备&#xff08;如打印机&#xff09;&#xff0c;需要先删…

黑马 pink h5+css3+移动端前端

网页概念 网页是网站的一页,网页有很多元素组成,包括视频图片文字视频链接等等,以.htm和.html后缀结尾,俗称html文件 HTML 超文本标记语言,描述网页语言,不是编程语言,是标记语言,有标签组成 超文本指的是不光文本,还有图片视频等等标签 常用浏览器 firefox google safari…

MFC 编辑框输入16进制字符串转换为16进制数或者10进制数据计算

1. 编辑框添加变量&#xff0c;并选择变量类型为CString。 CString m_strReg; DDX_Text(pDX, IDC_EDIT_REG, m_strReg); 2. 使用“strtoul”或“_tcstoul”函数将Cstring 类型转换为16进制/10进制数进行计算。 CString tmp; UpdateData(TRUE); UpdateData(FALSE); …

【KD】知识蒸馏与迁移学习的不同

知识蒸馏与迁移学习的不同 (1)数据域不同. 知识蒸馏中的知识通常是在同一个目标数据集上进行迁移&#xff0c;而迁移学习中的知识往往是在不同目标的数据集上进行转移. (2)网络结构不同. 知识蒸馏的两个网络可以是同构或者异构的&#xff0c;而迁移学习通常是在单个网络上利用其…

anaconda简单使用

anaconda 是一个环境管理工具&#xff0c;各个环境的安装包互不影响 下载 https://www.anaconda.com/ 配置 更换清华下载源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsin…

LabVIEW基础-lvlib库

文章目录 lvlib库llb库lvlib与llb的区别lvlib常见错误断开vi与库之间的连接 lvlib库 文件-新建-库&#xff0c;创建一个项目库文件。能在项目中创建的文件类型&#xff0c;都可以在库中创建。 在lvlib上右键-添加-文件&#xff0c;将被选中的文件放到lvlib中。被添加进lvlib的…

关于ETL的两种架构(ETL架构和ELT架构)

ETL&#xff0c;是英文 Extract-Transform-Load 的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform&#xff09;、加载&#xff08;load&#xff09;至目的端的过程。ETL一词较常用在数据仓库&#xff0c;但其对象…

【Linux】Tcp服务器的三种与客户端通信方法及守护进程化

全是干货~ 文章目录 前言一、多进程版二、多线程版三、线程池版四、Tcp服务器日志的改进五、将Tcp服务器守护进程化总结 前言 在上一篇文章中&#xff0c;我们实现了Tcp服务器&#xff0c;但是为了演示多进程和多线程的效果&#xff0c;我们将服务器与客户通通信写成了一下死循…

OpenCv之视频人脸识别

一、人脸检测 案例代码如下: import cv2 import numpy as npvideo cv2.VideoCapture(1.mp4) face_detector cv2.CascadeClassifier(haarcascade_frontalface_alt.xml) while True:retval,image video.read() # retval boolean类型表名是否获得了图片if not retval:pr…