博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1160 Post Office
阅读量:5256 次
发布时间:2019-06-14

本文共 1427 字,大约阅读时间需要 4 分钟。

 

  这是一道DP的题,用w[i][j]代表用一个邮局覆盖第i个到第j个点所得到的最小距离和。

f[i][j]代表用前i个邮局覆盖前j个点所得到的最小距离和。然后根据这里我们可以推

出状态转移方程为:f[i][j] = min( f[i][j ] , f[i - 1][k] + w[k + 1][j] )  ( k < j).

/*Accepted    528K    79MS    C++    1195B    2012-08-07 14:23:15*/#include
#include
#include
#include
using namespace std;const int MAXP = 35, MAXV = 305, INF = 0x3f3f3f3f;int a[MAXV], f[MAXP][MAXV], w[MAXV][MAXV];int p, v;void init(){ int i, j, k, m; for(i = 1; i <= v; i ++) scanf("%d", &a[i]); for(i = 1; i <= v; i ++) { for(j = i; j <= v; j ++) { w[i][j] = 0; m = i + j >> 1; for(k = i; k <= j; k ++) { if(k <= m) w[i][j] += (a[m] - a[k]); if(k > m) w[i][j] += (a[k] - a[m]); } } } for(i = 1; i <= p; i ++) for(j = 1; j <= v; j ++) f[i][j] = INF; for(j = 1; j <= v; j ++) f[1][j] = w[1][j];}void dp(){ int i, j, k; for(i = 2; i <= p; i ++) for(j = 2; j <= v; j ++) for(k = i; k <= j; k ++) f[i][j] = min(f[i][j], f[i - 1][k] + w[k + 1][j]);}int main(){ while(scanf("%d%d", &v, &p) == 2) { init(); dp(); printf("%d\n", f[p][v]); } return 0;}

转载于:https://www.cnblogs.com/Yu2012/archive/2012/04/02/2430149.html

你可能感兴趣的文章
【特征匹配】BRISK原文翻译
查看>>
grep 基于关键字搜索
查看>>
virtualbox开启虚拟机时报错
查看>>
HDU5461 Largest Point(暴力)
查看>>
[No0000147]深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing)理解堆与栈4/4
查看>>
linux及安全期中总结——20135227黄晓妍
查看>>
08.存储Cinder→2.理解Block Storage Service
查看>>
pku 2253 Frogger 第一周训练——最短路
查看>>
【Prince2科普】P2七大主题之计划
查看>>
TCP三次握手详解及释放连接过程
查看>>
Python数据可视化利器Matplotlib,绘图入门篇,Pyplot介绍
查看>>
gnome3
查看>>
Bootstrap 弹出框和警告框插件
查看>>
Tomcat内存问题分析
查看>>
如何开通win8.1的ping
查看>>
来了,老弟!__二进制部署kubernetes1.11.7集群
查看>>
算法复习-生成全排列
查看>>
期末总结
查看>>
冒泡排序(一分钟懂)
查看>>
linux常用命令随记
查看>>