实用算法实现-第 10 篇 动态规划

动态规划在算法中的实践 为了提高算法的效率,动态规划是在算法实践中经常使用的一个思想,有些问题会非常适合使用动态规划的思想来设计算法。本文将借助LeetCode上的一些例子,来讲解和说明动态规划在算法案例中的一些实践。 阅读详情

10.1    动态规划

10.1.1   实例

PKU JudgeOnline, 1160, Post Office.

10.1.2   问题描述

       一条直线上分布着V个村庄。要在这些村庄中的某些村庄里建一共P个邮局,使得村庄到离它最近的邮局的距离之和最小。输出这个的最小距离之和。

10.1.3   输入

105

12 3 6 7 9 11 22 44 50

10.1.4   输出

9

10.1.5   分析

思路:用opt[i][j]记录把前i个邮局建到前j个村庄中的最优解,用cost[i][j]记录所有在i到j村庄中,建1个邮局的最小代价。显然邮局应该设到中点。让前i个邮局覆盖前j个村庄,第i+1个邮局覆盖第j+1至j+k个村庄(j+k<=n),则状态转移方程为:

opt[i+1][j+k]=min{opt[i][j]+cost[j+1][j+k];} (k+j<=n)

Cost数组存放从i到j中有一个邮局的最小代价,显然该邮局应该放在中间。

Opt[i][j] 表示前i个邮局覆盖前j个村庄的最小代价,对于i=1来说,opt[i][j] = cost[i][j],让前2个邮局覆盖前j个村庄,也就是i=2的情况,可能是一下情况的最优解:第一个邮局覆盖第一个村庄,第二个村庄覆盖2-j个村庄,或者第一个邮局覆盖第1-2个村庄,第二个村庄覆盖3-j个村庄,第一个邮局覆盖第1-3个村庄,第二个村庄覆盖4-j个村庄,等等等等。

10.1.6   程序

#include <iostream.h>
#include <string.h>
int  distance[303];
int cost[303][303];
int opt[303][303];
int main()
{
     int V,P;
     int i;
     int j;
     int k;
     int mid;
     while(cin>> V){
         cin >> P;
         for(i =1; i <= V; i++){
              cin >> distance[i];
         }
         memset(cost, 0, sizeof(cost));
         for(i =1; i <= V; i++){
              for(j= i; j <= V; j++){
                   cost[i][j] = 0;
                   mid = (i + j)/2;
                   for(k= i; k <= j; k++){
                       inttemp = distance[mid] - distance[k];
                       if(temp< 0){
                            temp = -temp;
                       }
                       cost[i][j] +=  temp;
                   }              
              }
}
         memset(opt, 0x7F, sizeof(opt));
         opt[0][0] = 0;
         for(i =0; i <= P; i++){
              for(j= i; j <= V; j++){
                 if(opt[i][j] < 0x7F7F7F7F){
                       for(k= j; k <= V; k++){
                            int temp = opt[i][j] + cost[j + 1][k];   
                            if(opt[i+1][k] > temp){
                                 opt[i+1][k] =temp;
                            }
                       }
                   }
            }
         }
         cout << opt[P][V] << endl;
     }
     return 1;
}

 

10.2    最长公共子序列(LCS)

LCS问题在《算法导论》中有着详尽的分析。

需要注意的是一个串的LCS并不是唯一的。

10.2.1   实例

PKU JudgeOnline, 1458, Common Subsequence.

10.2.2   问题描述

给定两个字符串,求两者的最长公共子序列的长度。

10.2.3   输入

abcfbc         abfcab

programming    contest

abcd           mnp

10.2.4   输出

4

2

0

10.2.5   分析

这是基本的LCS问题。问题并不复杂,因为这里不需要构造一个LCS,而只需求出LCS的长度。

10.2.6   程序

#include <iostream>
#include <string.h>
using namespace std;
int C[1000][1000];
     charX[10000];
     charY[10000];
int main()
{
     while(cin>>X>>Y)
     {
         int m =strlen(X), n = strlen(Y);
         int i =0;
         for(i=0;i<m;i++)C[i][0] = 0;
         for(i=0;i<n;i++)C[0][i] = 0;
         for(i=0;i<m;i++)
         {
              for(int j=0;j<n;j++)
              {
                   if(X[i] == Y[j])
                   {
 
                       C[i][j] = C[i-1][j-1] +1;
                   }
                   elseif (C[i-1][j] >= C[i][j-1])
                   {
 
                       C[i][j] = C[i-1][j];
                   }
                   else
                   {
                       C[i][j] = C[i][j-1];
                   }
              }
         }
         cout << C[m-1][n-1] <<endl;
     }
     return 1;
}

10.3    实例

PKU JudgeOnline, 1160, Post Office.

PKU JudgeOnline, 1014, Dividing.

PKU JudgeOnline, 1157, LITTLE SHOP OFFLOWERS.

PKU JudgeOnline, 3356, AGTC.

PKU JudgeOnline, 1080, Human GeneFunctions.

PKU JudgeOnline, 2250, Compromise.

PKU JudgeOnline, 1458, Common Subsequence.

本文章欢迎转载,请保留原始博客链接http://blog.youkuaiyun.com/fsdev/article
JAVA算法:切割木棒—递归算法与动态规划算法 JAVA算法:切割木棒—递归算法与动态规划算法 给定一根长度为N的木棒和一系列价格,其中包含所有小于N的尺寸的价格。通过切割木棒和出售木棒来确定可获得的最大值。 例如,如果木棒的长度为8,不同部分的值如下所示,则可获得的最大值为22(通过切割两段长度2和6) 长度 1 2 3 4 5 6 7 8 价值 1 5 8 9... 阅读详情

相关推荐

高通camx架构学习(零)—— 深入理解Camera 硬件抽象层

从上面的定义可以看出,主要是通过hw_module_t 代表了模块,通过其open方法用来打开一个设备,而该设备是用hw_device_t来表示,其中除了用来关闭设备的close方法外,并无其它方法,由此可见谷歌定义的HAL接口,并不能满足绝大部分HAL模块的需要,所以谷歌想出了一个比较好的解决方式,那便是将这两个基本结构嵌入到更大的结构体内部,同时在更大的结构内部定义了各自模块特有的方法,用于实现模块的功能,这样,一来对上保持了HAL的统一规范,二来也扩展了模块的功能。

图像学习之旅 1669

线段覆盖2(动态规划)

http://wikioi.com/problem/3027/ #includehttp://wikioi.com/problem/3027/eam> #include #include #include #include #include #include using namespace std; #define maxn 1005 int dp[ maxn ] ; struct no

bo-jwolf的专栏 1915

通义千问AI模型对接飞书机器人-集成飞书机器人(2-2)

http请求地址上一篇百炼平台配置的应用地址。

hefaji的博客 1916

动态规划之直线k覆盖问题

import java.util.Scanner; public class ZhiXianKFuGai {     private static int n,m,r;     private static int[] x,w,c;     private static int[][] opt1,opt2;     private static int MAX = 1000000;   ...

生命不息,奋斗不止 2371

从零开始:使用Labelme完成图像语义分割标注全流程

本文详细介绍了如何使用Labelme工具完成图像语义分割标注的全流程,从环境安装、数据准备到核心标注操作,并重点讲解了如何将标注结果转换为PASCAL VOC等深度学习框架可用的标准数据集格式。文章还提供了关键的避坑指南和高效技巧,帮助初学者快速上手,高效产出高质量的标注数据。

weixin_29073241的博客 492

科普:Frenet坐标

理想情况下,描述这种常见驾驶行为在数学上应该很容易。一种方法是使用新的坐标系。现在,而不是放下一个正常的笛卡尔网格,我们做一些事情,就像你看到下面…Frenet Coordinates是一种以比传统x,y笛卡尔坐标更直观的方式表示道路位置的方式。如果我们想要方程式来描述这个动作,那就不容易了!想象一下像下面这样一条弯曲的道路,笛卡尔坐标系就位于它的上面…使用这些笛卡尔坐标,我们可以尝试描述车辆通常在路上行驶的路径…那么在Frenet坐标系下呈现的典型轨迹是什么样的?在这里,我们定义了一个新的坐标系统。

OceanStar的博客 1万+

算法设计与分析: 3-27 直线k覆盖问题

3-27 直线k覆盖问题 问题描述 给定一条直线L上的n个点x1&amp;amp;lt;x2&amp;amp;lt;...&amp;amp;lt;xnx1&amp;amp;lt;x2&amp;amp;lt;...&amp;amp;lt;xnx_1 xixix_i都有一个权w(i)≥0w(i)≥0w(i)\geq0,以及在该点设置服务机构的费用 c(i)≥0c(i)≥0c(i)\geq0 。每个服务机构的覆盖半径为 r。直线 k 覆盖问题要求找出Vn={

d3y1`5 81_09 2033

openEuler在虚拟机的网络配置

ethernet0.virtualDev 可以配置成其他类型的虚拟网络适配器。常见的选项包括:vlance - 用于模拟 AMD PCnet32 LANCE 网络适配器,支持10Mbps。e1000 - 用于模拟 Intel E1000 千兆网络适配器,支持1Gbps。e1000e - 用于模拟更现代的 Intel E1000e 千兆网络适配器。vmxnet - 用于 VMware 的自定义网络适配器,性能更好但需要安装 VMware Tools。

FHY1221的博客 2932

区间覆盖问题

区间覆盖问题

HackingGate的博客 1941

一文读懂医疗大模型测评基准

面对市场上浩若星海的大模型,医院管理者如何采购适合自身场景的解决方案?如何选取好的模型作为基础进行课题研究?都是医院需要特别重视的问题。评测基准则benchmark是这些问题的重要解法,国内北京、上海、浙江已然开展了相关的标准化工作。

dz102的博客 1840

14、利用Helm和GitOps实现Kubernetes资源管理与CI/CD流程优化

本文介绍了如何结合Helm、GitOps和Terraform等工具,优化Kubernetes资源管理和CI/CD流程。内容涵盖了Helm提供程序的配置、GitOps的核心理念、CI/CD管道的构建与测试策略、GitHub源代码管理模型以及流程优化建议,旨在提升软件开发和部署的效率与质量。

y7z8a9的博客 155

详解动态规划算法(Python实现动态规划算法典型例题)

动态规划(Dynamicprogramming) 是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。 什么是动态规划 动态规划(Dynamic Programming)对于子问题重叠的情况特别有效,因为它将子问题的解保存...

一个平平无奇的甜妹 4万+

寄存器与计数器设计(Verilog)

always @(posedge Reset or posedge Clock)//请在括号中补充敏感信号列表。always @(negedge Resetn , posedge Clock)//请在括号中补充敏感信号列表。always @(negedge Resetn,posedge Clock)//请在括号中补充敏感信号列表。//为了便于自动评测,请勿更改n的值。//为了便于自动评测,请勿更改n的值。//为了便于自动评测,请勿更改n的值。//为了便于自动评测,请勿更改n的值。

M_inherit的博客 362

matlab实现动态规划算法

matlab实现动态规划算法论文例子实现算法代码 最近看缓存相关论文,里面提到动态规划算法来解决小规模组合优化最优解,便尝试复DP算法,论文给出了一个简单例子,先从实现该例子开始,话说动态规划算法可以写好多东西,作为一个外行,第一次接触动态规划,断断续续花了一周多时间实现该算法,不知道这个效率去公司是不是已经被炒鱿鱼了。动态规划入门简单例子肯定从背包问题说起。 背包问题,讲解的通俗易懂,看懂后可以大致了解动态规划步骤,看懂后这种思想便可以移植到其他问题上。 论文例子 论文title《Mobility-Awa

weixin_43835470的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【算法】动态规划

动态规划、最长公共子序列

小匠码农 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

《算法和数据结构》动态规划篇

动态规划,面试的噩梦,第九题你会吗?

英雄哪里出来 5万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

动态规划算法

1. 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法 2. 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 3. 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立

舒克日记的博客 3万+

【算法模板】动态规划(基础DP篇)

将过去和羁绊全部丢弃,不好吝惜那为梦想留下的泪水。 ——路飞

小宝的博客 3085

2025高频面试算法总结篇【动态规划】

2025高频面试算法总结篇——动态规划

高朗的博客 1745

MATLAB实现动态规划算法,基于Matlab的动态规划算法的实现及应用

陈甜甜【摘要】介绍了动态规划的基本理论,包括动态规划的基本概念和基本原理,并针对生产与存储问题进行了分析,然后结合Matlab做了编程处理,使复杂问题简单化,从而使问题能更方便地得到解决。【关键词】动态规划生产与存储问题Matlab语言一、引言动态规划是用于解决运筹学中多阶段决策过程最优化问题的一种方法。其广泛应用于工程技术、科学管理、工农业生产及军事等领域。在理论上,动态规划是求解这类问题全局最...

weixin_39599654的博客 3240

【算法之Python篇】动态规划

爬楼问题 方法一 递归方法实现爬10阶楼梯的问题 def F(n): if n==1: return 1 if n==2: return 2 return F(n-2)+F(n-1) print(F(10)) >>>89 方法二 10阶楼梯运用单纯递归的方法轻松得到结果,可是当阶数变成100的时候或者更多的时候,想要得出结果可就没有怎么轻松了,则就需要通过剔除重复项将算法进行优化。 def F(n): if n==1:

IsQiya Bug Worlde 5052

java实现动态规划算法

(1) v[i][0]=v[0][j]=0; //表示 填入表 第一行和第一列是 0 (2) 当 w[i]> j 时:v[i][j]=v[i-1][j] // 当准备加入新增的商品的容量大于 当前背包的容量时,就直接使用上一个 单元格的装入策略 (3) 当 j>=w[i]时: v[i][j]=max{v[i-1][j], v[i]+v[i-1][j-w[i]]} // 当 准备加入的新增的商品的容量小于等于当前背包的容量, // 装入的方式: v[i-1][j]: 就是上一个单元格的装入的最大值 v[i]

闵浮龙的博客 1340

python实现动态规划算法

通过上述示例,我们可以看到动态规划解决问题的一般步骤和思想。动态规划在解决许多具有重叠子问题和最优子结构性质的问题中非常有效,例如背包问题、最长公共子序列、编辑距离等。在实际应用中,动态规划需要合理设计状态和状态转移方程,并注意空间和时间复杂度的优化。

闲人编程的博客 1428
上一篇: 实用算法实现-第 9 篇 RMQ问题
下一篇: 实用算法实现-第 11 篇 贪心算法
存储李希
博客等级 码龄15年 418粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值