【算法】动态规划

2023-11-20

动态规划的定义:
动态规划是运筹学的一个分支,是求解决策过程的最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。在各种算法中,我认为动态规划是较难掌握好的,主要难在模型的建立。
解题的一般步骤是:
1.找出最优解的性质,刻画其结构特征和最优子结构特征;
2.递归地定义最优值,刻画原问题解与子问题解间的关系;
3.以自底向上的方式计算出各个子问题、原问题的最优值,并避免子问题的重复计算;
4.根据计算最优值时得到的信息,构造最优解。
话不多说,我们来看几个具体的例子慢慢理解它:
1.矩阵连乘
给定n个可连乘的矩阵{A1, A2, …,An},根据矩阵乘法结合律,可有多种不同计算次序,每种次序有不同的计算代价,也就是数乘次数。例如给定2个矩阵A[pi,pj]和B[pj,pk],A×B为[pi,pk]矩阵,数乘次数为pi×pj×pk。将矩阵连乘积Ai…Aj简记为A[i:j] ,这里i≤j。考察计算A[i:j]的最优计算次序,设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,i≤k<j,则A[i:j]的计算量=A[i:k]的计算量+A[k+1:j]的计算量+A[i:k]和A[k+1:j]相乘的计算量。计算A[i:j]的最优次序所包含的计算矩阵子链A[i:k]和A[k+1:j]的次序也是最优的。即矩阵连乘计算次序问题的最优解包含着其子问题的最优解,这种性质称为最优子结构性质,问题具有最优子结构性质是该问题可用动态规划算法求解的显著特征。POJ1651就是一道具有类似思想的题目。题目大意是给出N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积。一直这样将每次的得分累加直到只剩下首尾两个数为止,问最小得分。
AC代码:

#define maxn 105
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[maxn][maxn],a[maxn]; 
 
int main()
{
    int n;
    cin>>n;
    int i,j,k,len;
    memset(dp,0,sizeof(dp)); 
    //len是设置步长,也就是j减i的值 
    for(i=0;i<n;i++) cin>>a[i];
    for(i=0;i<n-2;i++) dp[i][i+2]=a[i]*a[i+1]*a[i+2];
    //如果只有三个数就直接乘起来 
    for(len=3;len<n;len++)
    {
        for(i=0;i+len<n;i++)
        {	
			j=i+len;
            for(k=i+1;k<j;k++)
			{
				if(dp[i][j]==0) dp[i][j]=dp[i][k]+dp[k][j]+a[i]*a[k]*a[j];
			 	else dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[k]*a[j]);
            }
        }
    }
    cout<<dp[0][n-1]<<endl;
}

2.走金字塔
给定一个由n行数字组成的数字三角型,如图所示。设计一个算法,计算从三角形的顶至底的一条路径,使该路径经过的数字总和最大。路径上的每一步都只能往左下或右下走,给出这个最大和。
        7 
      3  8 
    8  1  0 
  2  7  4  4 
4  5  2  6  5
这个问题来源于POJ1163。对于这种问题,我们可以有正向和反向两种思考方式。正向思考这个问题,dp[i][j]表示从第一行第一列到第i行第j列最大的数字总和;反向思考这个问题,dp[i][j]表示从第i行第j列到最后一行最大的数字总和。反向思考的代码要简洁一些,在POJ上这两份代码所用时间都是32MS。当然我们还可以对空间再进行优化,这里就不再细说了。
AC代码:

#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int triangle[110][110],dp[110][110];
 
int main()
{
	int N;
	cin>>N;
	memset(dp,0,sizeof(dp));
	memset(triangle,0,sizeof(triangle));
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=i;j++)
		{
			cin>>triangle[i][j];
		}
	}
	dp[1][1]=triangle[1][1];
	for(int i=2;i<=N;i++)
	{
		for(int j=1;j<=i;j++)
		{
			if(j!=1) dp[i][j]=max(dp[i][j],dp[i-1][j-1]+triangle[i][j]);
			if(j!=i) dp[i][j]=max(dp[i][j],dp[i-1][j]+triangle[i][j]);
		}
	}
	int max=-1;
	for(int i=1;i<=N;i++)
	{
		if(dp[N][i]>max) max=dp[N][i];
	}
	cout<<max<<endl;
}
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int triangle[110][110],dp[110][110];
 
int main()
{
	int N;
	cin>>N;
	memset(dp,0,sizeof(dp));
	memset(triangle,0,sizeof(triangle));
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=i;j++)
		{
			cin>>triangle[i][j];
		}
	}
	for(int i=1;i<=N;i++)
	{
		dp[N][i]=triangle[N][i];
	}
	for(int i=N-1;i>=1;i--)
	{
		for(int j=1;j<=i;j++)
		{
			dp[i][j]=max(dp[i+1][j]+triangle[i][j],dp[i+1][j+1]+triangle[i][j]);
		}
	}
	cout<<dp[1][1]<<endl;
}

转载来源:https://blog.csdn.net/qq_32400847/article/details/51148917


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【算法】动态规划 的相关文章

  • 网络工程师学习笔记-------关于T1和E1载波

    关于T和E载波 标准模拟话音信号频率为4KHz 为了对模拟语音进行数字化 必须按至少8KHz的速率采样 采用7Bit进行量化即128级量化 则每个信道的比特率为 8KHz 7Bit 56Kb s 为了每一个这样的低速信道安装一条通信线路是不

随机推荐

  • 机器学习F1值的概念

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 什么是F1 score 二 计算过程 1 首先定义以下几个概念 2 通过第一步的统计值计算每个类别下的precision和recall 3 通过第二步计算结果计
  • openstack-nova-compute.service起不来

    1 启动服务 2 查看compute nova日志tail var log nova nova compute log 发现身份验证机制AMQPLAIN拒绝登录 3 关闭防火墙 root controller systemctl stop
  • 资讯汇总230217

    230217 22 48 美联储理事鲍曼 美国通胀仍旧太高 美联储理事鲍曼表示 美国通胀仍旧太高 美国当前的经济数据不一致 不同寻常的低失业率是一个好迹象 让通胀回到目标还有很长的路要走 需要继续加息 直到看到更多进展 财联社 230217
  • 西门子PLC如何与多个三菱PLC建立无线通信?

    对一个大型工厂 由于生产线的不断改造 新老流程的不断更新 这些PLC系统往往是由不同的制造商提供的 那么在智慧工厂的实现中 常会遇到不同品牌PLC之间需要进行相互通讯的情况 由于场地和生产能效的原因 在后期的系统改造中 通常需要采用无线的方
  • 构建流式应用—RxJS详解

    最近在 Alloyteam Conf 2016 分享了 使用RxJS构建流式前端应用 会后在线上线下跟大家交流时发现对于 RxJS 的态度呈现出两大类 有用过的都表达了 RxJS 带来的优雅编码体验 未用过的则反馈太难入门 所以 这里将结合
  • Oracle块损坏处理(MOS)

    处理 Oracle 块损坏 文档 ID 1526911 1 适用于 Oracle Database Enterprise Edition 版本 7 0 16 0 到 11 2 0 2 0 发行版 7 0 到 11 2 本文档所含信息适用于所
  • 微信小程序 如何返回上一个页面并实现刷新

    转载地址 https blog csdn net u011088792 article details 87938213 删除或编辑 之后返回 上一级并刷新 var pages getCurrentPages var beforePage
  • R语言实现RMF模型

    RMF模型说明 RMF模型是客户管理中 常被用来衡量客户价值和客户创利能力的重要方法 它主要考量三个指标 最近一次消费 Recency 近期购买的客户倾向于再度购买 消费频率 Frequency 经常购买的客户再次购买概率高 消费金额 Mo
  • 8年测试经验分享 —— 从0铸造测试技术壁垒

    前言 相信所有从事着软件测试或相关工作的同学都会思考一个问题 如何在持续且部分重复的测试活动中有效的进行测试技术积累 这个有趣的问题我先不予回答 我们先谈谈如何有效保证软件质量 作为团队中的质量保证者 需要深刻的意识到 验证系统原有功能是否
  • oracle 12c recover table恢复单表

    在 Oracle 12c 之前 如果误删一张表 常规的方法是 Flashback 闪回或 TSPITR 如果需要恢复的表空间过大 TSPITR 会耗时非常久 而开启 flashback 会消耗磁盘空间 在 12C 中oracle提供一个新功
  • java接口的详解

    文章目录 接口 1 1 接口的概念 1 2 接口语法规则 1 3 接口使用 1 4 接口特性 1 5 实现多个接口 1 6 接口间的继承 1 7 特殊的接口 1 7 1 Comparable接口实现compareTo方法 1 7 2 Com
  • 5. 一线大厂高并发缓存架构实战与性能优化

    分布式缓存技术Redis 1 冷热数据分离 2 缓存设计 2 1 缓存击穿 失效 2 2 缓存穿透 2 3 缓存雪崩 3 大V直播带货导致线上商品系统崩溃原因分析 4 突发性热点缓存重建导致系统压力暴增问题 5 缓存数据库双写不一致问题 6
  • pytest+UI自动化测试结果回填到excel并发送excel测试报告邮件

    现在写的脚本是web UI自动化 这个和接口自动化区别非常大 没法像接口那样请求 返回 校验结果 UI自动化 一个用例跑下来 是页面 页面 页面 完成 这样 但是还是想实现一种结果回填到excel中 看测试结果就直接看excel就可以了 一
  • WPF 路径动画PathAnimations的使用

    在wpf中让一个控件按照一定的路径运行的动画 叫做路径动画 这个示例演示了让一个rectangle按照一个s形曲线反复运行的动画 效果 只有一个文件 全部代码如下
  • 第三章 创建主窗口

    创建一个主窗口 具有菜单 工具栏 状态栏和对话框之类的界面和功能 实现电子制表软件的主窗口框架 效果 mainwindow h 头文件就不做太多解释 以注释的方式解释函数 ifndef MAINWINDOW H define MAINWIN
  • 收藏!超全机器学习资料合集!(附下载)

    来源 机器学习算法与自然语言处理 本文长度为1098字 建议阅读3分钟 本文为你分享机器学习爱好者必备的资源 最近在群里发现一些小伙伴在寻找资料的时候总是无处可找 网上出现很多收集免费资料再去打包收钱的人 我看不惯这样的人 所以把自己收集的
  • 深度学习03—手写数字识别实例(Tensorflow版实验)

    目录 0 实验概述 1 利用Tensorflow自动加载mnist数据集 2 手写数字识别体验 2 1 准备网络结构与优化器 2 2 计算损失函数与输出 2 3 梯度计算与优化 2 4 循环 2 5 完整代码 补充 os environ T
  • linux学习2:定时任务

    1 crontab命令 crontab e 编辑crontab定时任务 crontab l 查询定人任务 crontab r 删除当前用户所有的定时任务 1 1 每分钟将home路径下的详细信息保存到 home ls txt中 cronta
  • prometheus告警模块ALTERMANAGER中抑制规则的使用

    prometheus服务端通过配置文件可以设置告警 下面是一个告警设置的配置文件alert yml groups name goroutines monitoring rules alert TooMuchGoroutines expr g
  • 【算法】动态规划

    动态规划的定义 动态规划是运筹学的一个分支 是求解决策过程的最优化的数学方法 20世纪50年代初美国数学家R E Bellman等人在研究多阶段决策过程的优化问题时 提出了著名的最优化原理 把多阶段过程转化为一系列单阶段问题 利用各阶段之间