动态规划入门第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;
}

 总结:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学会动态规划】最小路径和(9)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

视频增强技术-去噪

本文介绍了关于视频增强技术的相关方法包括传统方法和基于深度学习的方法&#xff0c;并给出了他们的对比实验结果&#xff0c;最后对它们简单的做了总结&#xff0c;文中有一些图片和总结来自于网上其他博主的文章&#xff0c;已在文中标记并给出了相关的原文链接&#xff0c;…

JAVA SE -- 第十天

&#xff08;全部来自“韩顺平教育”&#xff09; 一、枚举&#xff08;enumeration&#xff0c;简写enum&#xff09; 枚举是一组常量的集合 1、实现方式 a.自定义类实现枚举 b.使用enum关键字实现枚举 二、自定义类实现枚举 1、注意事项 ①不需要提供setXxx方法&#xff…

开源QianWei搭建音乐网站,并实现公网连接

开源QianWei搭建音乐网站&#xff0c;并实现公网连接 1、前言2、本地网页搭建2.1环境使用2.2 支持组建选择2.3 网页安装 3、本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4、公网访问测试5、结语 1、前言 音乐是我们生活和工作中不可或缺的调剂&#xff0c;它能让我们心…

155、基于STM32单片机老人防跌倒摔倒GSM短信报警系统ADXL345加速度设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 单片机主芯片选…

【PostgreSQL内核学习(六)—— 工具使用学习】

工具使用学习 工具使用学习安装中出现的问题 声明&#xff1a;本文的工具学习内容来自于《小宇带你学pg内核分析》 工具的代码仓库链接为&#xff1a; https://github.com/shenyuflying/pgNodeGraph 此外&#xff0c;我还参考了以下文章&#xff1a; https://rng-songbaobao.bl…

Mac配置Latex环境教程2023

第一步&#xff1a;安装MacTex 官网&#xff1a;https://www.tug.org/mactex/ 第二步&#xff1a;安装编译器&#xff1a;Texpad xclient官网下载Texpad&#xff1a;https://xclient.info/s/texpad.html 第三步&#xff1a;开始使用 LeTex \documentclass{article}\begin{do…

rabbitmq模块启动报java.net.SocketException: socket closed的解决方法

问题 最近在接手一个项目时&#xff0c;使用的是spring-cloud微服务构架&#xff0c;mq消息消费模块是单独一个模块&#xff0c;但启动这个模块一直报如下错误&#xff1a; java.net.SocketException: socket closed 这个错误是这个模块注册不到nacos报的错&#xff0c;刚开…

在Debian 12 上安装 PHP 5.6, 7.4

环境&#xff1a;Debian 12 Debian 12 默认的PHP版本为 8.2 如果直接安装php7.4就出现下面的报错&#xff1a; sudo apt-get install libapache2-mod-php7.4 php7.4 php7.4-gd php7.4-opcache php7.4-mbstring php7.4-xml php7.4-json php7.4-zip php7.4-curl php7.4-imap p…

Spring使用注解存储Bean对象

文章目录 一. 配置扫描路径二. 使用注解储存Bean对象1. 使用五大类注解储存Bean2. 为什么要有五大类注解&#xff1f;3.4有关获取Bean参数的命名规则 三. 使用方法注解储存Bean对象1. 方法注解储存对象的用法2. Bean的重命名 在前一篇博客中&#xff08; Spring项目创建与Bean…

RS485/RS232自由转ETHERNET/IP网关rs485和232接口一样吗

你是否曾经遇到过这样的问题&#xff1a;如何将ETHERNET/IP网络和RS485/RS232总线连接起来呢&#xff1f; 远创智控的YC-EIP-RS485/232通讯网关&#xff0c;自主研发的ETHERNET/IP从站功能&#xff0c;完美解决了这个难题。这款网关不仅可以将ETHERNET/IP网络和RS485/RS232总线…

访客报警定位管理系统:提升安全管理水平的创新解决方案

在当前日益复杂的安全环境下&#xff0c;保障人员安全、提高安全响应能力和管理效率成为了各行各业的首要任务。 作为一种先进的安全管理解决方案&#xff0c;访客报警定位管理系统凭借其独特的优势和广泛的应用场景&#xff0c;正逐渐成为各行业安全管理的重要工具。 那么&a…

「深度学习之优化算法」(十七)灰狼算法

1. 灰狼算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   灰狼算法(Grey Wolf Algorithm)是受灰狼群体捕猎行为启发而提出的算法。算法提出于2013年,仍是一个较新的算法。目前为止(2020)与之相关的论文也比较多,但多为算法的应用,应该仍有研究和改进的余…

数学建模-时间序列分析 实例

实例1销量数据预测和实例2人口数据预测实例3上证指数预测和实例4gdp增长率预测 数据-定义时间 不加置信区间清晰点 例二 实例3

性能测试-Jmeter之Linux下压力测试

我们在做测试的时候&#xff0c;有时候要运行很久&#xff0c;公司用的测试服务器一般都是linux&#xff0c;就可以运行在linux下面&#xff0c;linux下面不能像windows一样有图形化界面&#xff0c;那怎么运行脚本呢&#xff0c;就先在windows上把脚本做好&#xff0c;然后在l…

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

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

Spring学习记录----十二、Spring IoC注解式开发

目录 十二、Spring IoC注解式开发 12.1 回顾注解 注解怎么定义&#xff0c;注解中的属性怎么定义&#xff1f; 注解怎么使用&#xff1f; 1--通过反射机制怎么读取注解&#xff1f; 代码 运行结果 2--通过反射机制怎么读取注解&#xff1f; 代码 运行结果 12.2 声明…

时序数据库 TDengine 与金山云两大产品完成兼容互认证

万物互联时代&#xff0c;企业数字化转型和政企上云如火如荼。在云计算迎来重大发展机遇的同时&#xff0c;数据库在企业数字化转型中也扮演着重要的角色——随着业务量的激增&#xff0c;数据库的弹性扩容、容灾备份等需求逐渐显现&#xff0c;在此挑战下&#xff0c;时序数据…

哈希:探索快速的数据存储和搜索方法

哈希&#xff1a;探索快速的数据存储和搜索方法 哈希表作为一种高效的数据存储结构&#xff0c;可以使数据的存储位置与关键码之间建立一一映射的关系&#xff0c;从而加快元素的搜索速度。然而&#xff0c;哈希方法也面临着哈希冲突的问题&#xff0c;即不同的关键字通过相同…

MyBatis操作数据库

1.MyBatis是什么&#xff1f; MyBatis 是⼀款优秀的持久层框架&#xff0c;它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接⼝和 Java POJO&#xf…