【难题】动态规划 NOI 162:Post Office 7624:山区建小学——找状态方程有点难 思路详细

本文主要是介绍【难题】动态规划 NOI 162:Post Office 7624:山区建小学——找状态方程有点难 思路详细,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:点击打开链接

题目大意:V个村庄,P个邮局,邮局建在村庄上,求一种建法,让V个村庄到最近邮局的距离最小

dp[i][j]:表示在1~i个村庄中建j个邮局时的路径最小值 

m[i][j]:表示从i到j只建立一个邮局的路径的最小值

若从第i个村庄到第j个村庄只选取一个作为邮局的话则选择第(i+j)/2个

一开始我没懂,直到自己画了个图,假设把在5建的邮局移到4,则其他村庄的距离变化如图,从4到3不会变化,所以除法向下取整不会有问题。


则状态转移方程:m[i][j]=m[i][j-1]+a[i]-a[(i+j)/2]

怎么理解呢?
1)i+j为偶数,有以下序列,此时在2建邮局
    1 2 3
    新加一个村庄,此时还是在2建邮局
    1 2 3 4
    则m[1][4]=m[1][3]+(4到2的距离)a[4]-a[(1+4)/2]
2)i+j为奇数,有以下序列,此时在2建邮局
    1 2 3 4
    新加一个村庄,此时在3建邮局。根据之前画的图,村庄仅有1~4时,在2、3建邮局都是路径最小值,m[1][4]不会变化
    1 2 3 4 5
    则m[1][4]=m[1][3](邮局位置变了但是值不变)+(5到3的距离)a[5]-a[(1+5)/2]

所以得:
初始化:dp[i][1]=m[1][i]

dp[i][j]=min{dp[k][j-1]+m[k+1][i]}(1<=k<i)

思路参考了这位博主:点击打开链接

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int a[301],m[301][301]={0},dp[301][31]={0};
int main()
{int V,P,i,j,sum=0,k;cin>>V;cin>>P;for (i=1;i<=V;i++){cin>>a[i];sum+=a[i];}for (i=1;i<=V;i++)for (j=i+1;j<=V;j++)m[i][j]=m[i][j-1]+a[j]-a[(i+j)/2];//初始化dpfor (i=1;i<=V;i++)for (j=2;j<=P;j++)dp[i][j]=sum;for (i=1;i<=V;i++)dp[i][1]=m[1][i];//dpfor (i=1;i<=V;i++)for (j=2;j<=P;j++)for (k=j-1;k<i;k++)//因为1~k至少j-1个邮局,所以k>=j-1,k从j-1开始遍历dp[i][j]=min(dp[i][j],dp[k][j-1]+m[k+1][i]);cout<<dp[V][P];return 0;
}

7624:山区建小学 这道题思路类似,只需在输入时处理一下

a[i]为每一个山区的位置
mi[i][j],i到j之间建一个小学的路程

dp[i][j],1~i之间建了j个小学

注意:
1、不要忘记初始化:dp[i][1]=mi[1][i]
2、要保证状态转移方程中每一项都已算出来
     k>=j-1,k+1<=i,j-1>=1即j>=2

#include<iostream>
#include<string.h>
using namespace std;
int dp[501][501],a[501],mi[501][501];
int m,n;
int main()
{int i,j,x,k;cin>>m>>n;a[1]=0;for (i=2;i<=m;i++){cin>>x;a[i]=a[i-1]+x;}for (i=0;i<=m;i++)mi[i][i]=0;for (i=1;i<=m;i++)for (j=i+1;j<=m;j++)mi[i][j]=mi[i][j-1]+a[j]-a[(i+j)/2];for (i=1;i<=m;i++)for (j=1;j<=n;j++)dp[i][j]=250000;for (i=1;i<=m;i++)dp[i][1]=mi[1][i];for (i=2;i<=m;i++)for (j=2;j<=n;j++)for (k=j-1;k<i;k++)dp[i][j]=min(dp[i][j],dp[k][j-1]+mi[k+1][i]);cout<<dp[m][n]<<endl;return 0;
}

这篇关于【难题】动态规划 NOI 162:Post Office 7624:山区建小学——找状态方程有点难 思路详细的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/Always_ease/article/details/80527234
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/369563

相关文章

自研四振子全向增益天线! 中兴问天BE6800Pro+路由器拆机和详细评测

《自研四振子全向增益天线!中兴问天BE6800Pro+路由器拆机和详细评测》中兴问天BE6800Pro+路由器已经上市,新品配备自研四振子全向增益天线,售价399元,国补到手339.15元,下面我们... 中兴问天BE6800Pro+路由器自上市以来,凭借其“旗舰性能,中端价格”的定位,以及搭载三颗自研芯片

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

Python MCPInspector调试思路详解

《PythonMCPInspector调试思路详解》:本文主要介绍PythonMCPInspector调试思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录python-MCPInspector调试1-核心知识点2-思路整理1-核心思路2-核心代码3-参考网址

将图片导入Python的turtle库的详细过程

《将图片导入Python的turtle库的详细过程》在Python编程的世界里,turtle库以其简单易用、图形化交互的特点,深受初学者喜爱,随着项目的复杂度增加,仅仅依靠线条和颜色来绘制图形可能已经... 目录开篇引言正文剖析1. 理解基础:Turtle库的工作原理2. 图片格式与支持3. 实现步骤详解第

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启

Java版本不兼容问题详细解决方案步骤

《Java版本不兼容问题详细解决方案步骤》:本文主要介绍Java版本不兼容问题解决的相关资料,详细分析了问题原因,并提供了解决方案,包括统一JDK版本、修改项目配置和清理旧版本残留等步骤,需要的朋... 目录错误原因分析解决方案步骤第一步:统一 JDK 版本第二步:修改项目配置第三步:清理旧版本残留兼容性对

exfat和ntfs哪个好? U盘格式化选择NTFS与exFAT的详细区别对比

《exfat和ntfs哪个好?U盘格式化选择NTFS与exFAT的详细区别对比》exFAT和NTFS是两种常见的文件系统,它们各自具有独特的优势和适用场景,以下是关于exFAT和NTFS的详细对比... 无论你是刚入手了内置 SSD 还是便携式移动硬盘或 U 盘,都需要先将它格式化成电脑或设备能够识别的「文