【难题】动态规划 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:山区建小学——找状态方程有点难 思路详细的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369563

相关文章

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Python自动化Office文档处理全攻略

《Python自动化Office文档处理全攻略》在日常办公中,处理Word、Excel和PDF等Office文档是再常见不过的任务,手动操作这些文档不仅耗时耗力,还容易出错,幸运的是,Python提供... 目录一、自动化处理Word文档1. 安装python-docx库2. 读取Word文档内容3. 修改

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

SpringBoot整合easy-es的详细过程

《SpringBoot整合easy-es的详细过程》本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供... 目录一、easy-es简介二、实现基于Spring Boot框架的应用程序代码1.添加相关依赖2.添

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二: