动态编程:允许互换时安装路灯

时间:2018-10-14 17:48:11

标签: algorithm dynamic-programming

我非常幼稚,我认为这种策略会起作用: 1)找到点亮一切的最佳方法 2)从最佳解决方案中找到K个最昂贵的块(解决方案不做任何更改) 3)查找K个最便宜的未使用块 4)将我们的解决方案中的昂贵块改为便宜块 不幸的是,如果K大于1,这不是最佳解决方案。

什么是有效,正确的算法?

Problem G. Fascination Street

输入文件:标准输入

输出文件:标准输出

时间限制:2秒

内存限制:1024兆字节

一条名为“迷恋街”的街道被分为N个等长的街区。对于每个块i(1≤i≤N), 如果i> 1,则其左侧为块i − 1;如果i

与它的名字不同,这条街臭名昭著,是夜晚的黑暗阴森之处。为了解决这个问题,罗伯特 决定为某些街区安装路灯。为第i个街区安装路灯的成本 是Wi,总成本是每个安装成本的总和。安装后,每个块应 有一个路灯,或者在左或右街区有一个路灯。

罗伯特(Robert)也有一些技巧可以降低成本。在安装路灯之前,Robert选择两个不同的块i和j,并交换它们的位置。手术后,将交换安装费用。 换句话说,该操作只是交换Wi和Wj的值。此操作没有成本,但是 罗伯特最多只能执行K次。

现在,给定阵列W和最大可能的操作数K,您应该找到整条街道的最低照明成本。

输入

第一行包含两个以空格分隔的整数N,K。N是块数,K是 最大可能的操作次数。 (1≤N≤250000,0≤K≤9) 第二行包含N个以空格分隔的整数W1,W2 ... WN,其中Wi是安装a的成本 第i个街区的路灯。 (0≤Wi≤109 )

输出

打印一个整数,其中包含整条街道的最低照明费用

1 个答案:

答案 0 :(得分:0)

我不确定这是否会超出您的内存限制,但是如何计算 W(i,k)我的房屋的照明成本最低,最多交换k次,房屋的位置存储在v(i,k)中,照明的房屋存储在位图BM(i,k)中?然后,根据先前的值继续计算W(i,k + 1)和W(i + 1,k),直到达到i = N,k = K。