这个问题有两个点需要注意: 1、 对于一种灯泡,要么全换,要么全不换。 证明: 设一种灯泡单价为p1,电池价格为k1,共需要L个,若把L1个灯泡换成单价为p2,电池为k2的灯泡,产生的总花费为p1*L1+k1 + p2*(L-L1)+k2 (1)。全不换为p1*L+k1 (2),全换为p2*L+k2 (3)。让(1)式分别跟(2),(3)式做差,会发现一正一负的情况,从数学的角度上证明了,要么全换,要么全不换。

  2、如果我要用第i种灯泡去替换前面的灯泡,那么一定是连续的替换,不可能出现间断,这也是这个问题的核心所在,他的原因很简单,给出一个排列,1,2,3,4,5。5向前替换,不可以出现4没有被替换,而3却被5替换的现象,因为这一定不是最优方案,4不被替换一定是比5更好,那么3就应该被4替换,而不该被5替换,这样对于4又是连续的替换了。 所以区间替换是正确的,也是这里最巧妙的,这样正确的限制决策成功方便了状态转移,并且不会丢失解。

  所以我们定义dp[i]表示处理到第i中灯泡的最小花费,对于第i个灯泡,则是dp[i] = min(dp[i],dp[j] + (s[i]-s[j])*pi + ki),枚举j即连续的替换个数。最后dp[n]即使答案。

  注意:处理的时候需要排序,s[i]用于记录前i个灯泡的和,千万要排序后再记录和,我当时偷懒在输入的时候累加了和,WA了很多次才发现这个错误。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Lamps
{
int v,vs,pri,num;
} l[];
bool cmp(Lamps a,Lamps b)
{
return a.v < b.v;
}
int dp[],suml[],n;
int main()
{
while(cin>>n)
{
if(n==) break;
suml[] = ;
for(int i = ; i <= n; i++)
{
cin>>l[i].v>>l[i].vs>>l[i].pri>>l[i].num;
}
dp[] = ;
sort(l+,l+n+,cmp);
for(int i = ; i <= n; i++)
{
suml[i] = suml[i-]+l[i].num;
}
for(int i = ; i <= n; i++)
{
dp[i] = suml[i]*l[i].pri + l[i].vs;
for(int j = i-; j >= ; j--)
{
dp[i] = min(dp[i],dp[j]+(suml[i]-suml[j])*l[i].pri+l[i].vs);
}
}
cout<<dp[n]<<endl;
}
return ;
}

UVA - 11400 Lighting System Design (区间DP)的更多相关文章

  1. UVa 11400 Lighting System Design【DP】

    题意:给出n种灯泡,分别给出它们的电压v,电源费用k,每个灯泡的费用c,和所需灯泡的数量l,问最优方案的费用 看的紫书= = 首先是dp[i]为灯泡1到i的最小费用, dp[i]=min(dp[i], ...

  2. 【线性结构上的动态规划】UVa 11400 - Lighting System Design

    Problem F Lighting System Design Input: Standard Input Output: Standard Output You are given the tas ...

  3. UVa 11400 Lighting System Design(DP 照明设计)

    意甲冠军  地方照明系统设计  总共需要n不同类型的灯泡  然后进入 每个灯电压v  相应电压电源的价格k  每一个灯泡的价格c   须要这样的灯泡的数量l   电压低的灯泡能够用电压高的灯泡替换   ...

  4. UVa 11400 - Lighting System Design(线性DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. UVA - 11400 Lighting System Design(照明系统设计)(dp)

    题意:共有n种(n<=1000)种灯泡,每种灯泡用4个数值表示.电压V(V<=132000),电源费用K(K<=1000),每个灯泡的费用C(C<=10)和所需灯泡的数量L(1 ...

  6. UVA 11400"Lighting System Design"

    传送门 错误思路 正解 AC代码 参考资料: [1]:https://www.cnblogs.com/Kiraa/p/5510757.html 题意: 现给你一套照明系统,这套照明系统共包含 n 种类 ...

  7. UVa 11400 Lighting System Design

    题意: 一共有n种灯泡,不同种类的灯泡必须用不同种电源,但同一种灯泡可以用同一种电源.每种灯泡有四个参数: 电压值V.电源费用K.每个灯泡的费用C.所需该种灯泡的数量L 为了省钱,可以用电压高的灯泡来 ...

  8. uva 11400 - Lighting System Design(动态规划 最长上升子序列问题变型)

    本题难处好像是在于 能够把一些灯泡换成电压更高的灯泡以节省电源的钱 .所以也才有了对最优方案的探求 好的处理方法是依照电压从小到大排序.仅仅能让前面的换成后面的.也就满足了把一些灯泡换成电压更高的灯泡 ...

  9. UVA 11400 Lighting System Design 照明系统设计

    首先是一个贪心,一种灯泡要么全都换,要么全都不换. 先排序,定义状态d[i]为前面i种灯泡的最小花费,状态转移就是从d[j],j<i,加上 i前面的j+1到i-1种灯泡换成i的花费. 下标排序玩 ...

随机推荐

  1. erlang 常用的计算长度函数

    1.size 可以计算元祖长度和标准binary长度 2.tuple_size 计算元祖长度 3.length 计算列表长度 4.byte_size 计算标准和非标准binary的长度 非标准 < ...

  2. 27.编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish 和Dog,定义主类E,在其main方法中分别创建其对象并测试对象的特性。

    ///Animal类 package d922A; public class Animal { private String kind; public String getKind() { Syste ...

  3. Oracle Day01 数据库基础

    1.数据库 它是一种软件产品,是用于存放数据.管理数据的存储仓库,是有效组织在一起的数据集合. 2.数据库和数据库对象的概念 数据库:指的是物理磁盘上的文件 数据库对象:存在于内存中用于跟数据库文件进 ...

  4. ZOJ 2158 POJ 1789 Truck History

    最小生成树,主要是题目比较难懂. #include <cstdio> #include <cstring> #include <cmath> #include &l ...

  5. c语言_头文件

    传统 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <assert.h> //设定插入点 #include <ctyp ...

  6. 《Windows驱动开发技术详解》之HelloDDK

    编写如下代码:

  7. MFC连接Access讲解(3合1) .

    方法一: 1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL.EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado1 ...

  8. hdu_5677_ztr loves substring(回文+二维多重背包)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5677 题意:给你N个串,问能否选出小于K个回文字符串使得选出的字符串的长度之和为L. 题解:很容易想到 ...

  9. SQL Server 存储过程进行分页查询

    CREATE PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage INT = 1 , --当前页页码 (即Top currPage) @showColum ...

  10. python2.6.6在centos6.4下安装

    1.wget http://www.python.org/ftp/python/2.6.6/Python-2.6.6.tar.bz2 2. tar xvjf Python-2.6.6.tar.bz2 ...