参考 http://www.cnblogs.com/Kiraa/p/5510757.html

http://www.cnblogs.com/zhaopAC/p/5159950.html

根据题目说明中的这句话

reduce the total system cost by eliminating some of the voltage sources and replacing the
lamps of that category with higher rating lamps.

可以判断某种电压的灯泡如果要换就全换,否则就不会eliminate某种电压。

这条题目的难点在于最优解符合一定的模式。

设d[i]为子问题灯泡1...i的最小开销,当前考虑灯泡种类i,d[i-1]已经是最优解。

编号1...(i-1)代表每种灯泡,按照电压从低到高排序,在最优解中,可能某个编号代表的灯泡已经被替换,但数量不变。

设每种灯泡的参数分别存放在V[],K[],C[],L[]这些数组中。

设 1<=j<=(i-1),j这种灯泡可以被替换成i这种灯泡,那么需要满足以下这些条件

1) V[j] < V[i]

2) K[j] + C[j]*L[j] < C[i]*L[j]

如果在编号 (j+1)...(i-1)这些种类的灯泡中有个编号x != j

因为1...(i-1)这些灯泡已经构成的最优解,j没有被x替换,那么需要满足以下这些条件

3) V[j] < V[x]

4) K[j] + C[j]*L[j] >= C[x]*L[j]

根据公式 2) 和 4)可知

C[x] <= C[i]

所以 K[x] + C[x]*L[x] < C[i]*L[x]

所以x这种灯泡也可以被替换成i

替换的模式是,如果某种灯泡可以被替换成i,那这种灯泡右边的灯泡都可以被替换成i

设s[i]为前i种灯泡的总数量,

d[i] = min{d[j] + (s[i]-s[j])*C[i] + K[i]} // 0 <= j <= (i-1)

1...j不替换,费用是d[j],(j+1)到(i-1)被替换成i,费用是(s[i]-s[j])*C[i] + K[i]

j = 0时,d[0] = 0,s[0] = 0,d[i] = s[i] * C[i] + K[i],相当于全部替换成i

#define _CRT_SECURE_NO_WARNINGS 

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <numeric> using namespace std; struct Lamp {
int V; // 1 <= V <= 132000, voltage rating
int K; // 1 <= K <= 1000, cost of voltage source of this rating
int C; // 1 <= C <= 10, cost of a lamp of this rating
int L; // 1 <= L <= 100, number of lamps required
}; int n; // 1 <= n <= 1000
const int maxn = ;
Lamp a[maxn + ];
int s[maxn + ];
int d[maxn + ]; bool comp(const Lamp &a, const Lamp &b)
{
return a.V < b.V;
} int main()
{ while (scanf("%d", &n) && n) {
for (int i = ; i <= n; i++){
scanf("%d%d%d%d", &a[i].V, &a[i].K, &a[i].C, &a[i].L);
} sort(a + , a + n + , comp); // sort based on voltage s[] = ; // s[i] = sum of numbers of 1..i types of lamps
for (int i = ; i <= n; i++) {
s[i] = s[i - ] + a[i].L;
} d[] = ; // d[i] = minium cost with 1..i types of lamps
for (int i = ; i <= n; i++){
d[i] = a[i].K + a[i].C * s[i]; // replace all lamps with type i
for (int j = ; j < i; j++) {
d[i] = min(d[i], d[j] + (s[i] - s[j])*a[i].C + a[i].K); // replace j+1...i with type i
}
} printf("%d\n", d[n]);
} return ;
}

9-6 UVa 11400的更多相关文章

  1. Uva 11400,照明系统设计

    题目链接:https://uva.onlinejudge.org/external/114/11400.pdf 题意:有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要 ...

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

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

  3. UVa 11400 Lighting System Design

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

  4. UVa 11400 Lighting System Design【DP】

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

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

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

  6. uva 11400 Problem F Lighting System Design

    紫皮书题: 题意:让你设计照明系统,给你n种灯泡,每种灯泡有所需电压,电源,每个灯泡的费用,以及每个灯泡所需的数量.每种灯泡所需的电源都是不同的,其中电压大的灯泡可以替换电压小的灯泡,要求求出最小费用 ...

  7. UVA - 11400 Lighting System Design (区间DP)

    这个问题有两个点需要注意: 1. 对于一种灯泡,要么全换,要么全不换. 证明: 设一种灯泡单价为p1,电池价格为k1,共需要L个,若把L1个灯泡换成单价为p2,电池为k2的灯泡,产生的总花费为p1*L ...

  8. Uva 11400 照明系统

    有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L.注意到,电压相同的灯泡只需要共享一个对应的电源即可,还有电压低的灯泡可以被电压高的灯泡替代.为了节约成 ...

  9. UVa 11400 照明系统设计

    https://vjudge.net/problem/UVA-11400 题意: 有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L.注意到,电压相同的灯 ...

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

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

随机推荐

  1. JavaScript实现无缝滚动 原理详细讲解

    先了解一下对象的几个的属性: innerHTML: 设置或获取位于对象起始和结束标签内的 HTML scrollHeight: 获取对象的滚动高度. scrollLeft: 设置或获取位于对象左边界和 ...

  2. web前端学习(二)html学习笔记部分(11)-- 没有标号记录的知识合集

    这一部分内容相对比较简单,就不按规矩排序了.(主要是网站上也没有这一部分内容的排序) 1.  html5的 非主体结构元素 学习笔记(1)里面记录过. 2.  html5表单提交和PHP环境搭建 1. ...

  3. TextBlock中显示文字和图片,且不会自动换行

    原本TextBlock显示图片是很容易的,即TextBlock.Inlines.Add(UiElement   element):这个方法即可, 但是,会出现如下效果: 我不想要这种效果,所以改了下代 ...

  4. 【GDOI2017 day2】凡喵识图 二进制切分

    题面 100 有一个显然的做法是\(O(n^2)\): 想办法优化这个做法: 我们给一个64位整数,切分成四个16位整数. 那么如果两个64位整数符合汉明距离为3的话,那么两者切分的四个16位整数中: ...

  5. DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS

    原文:DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0 ...

  6. 几道莫名AC的并查集题

    那啥那啥 原本今天还是做(看)差分约束的,但是上不去Vjudge我只能来刷并查集了. %%%静萱大佬把那么多年的noip题都刷遍了,我只能刷水题,noip的题实在是太难了不会啊. 第一道:洛谷P202 ...

  7. windows中Navicat连接centos中的mysql报:1130-Host '192.168.xxx.1' is not allowed to connect to this MySQL解决方法

    解决方法: 在centos中登录mysql输入下面指令: grant all PRIVILEGES on *.* to ' WITH GRANT OPTION;

  8. jquery全屏图片滑动切换

    在线演示 本地下载

  9. 【JZOJ4886】【NOIP2016提高A组集训第13场11.11】字符串

    题目描述 某日mhy12345在教同学们写helloworld,要求同学们用程序输出一个给定长度的字符串,然而发现有些人输出了一些"危险"的东西,所以mhy12345想知道对于任意 ...

  10. 使用 Markdown Flow 画流程图

    使用 Markdown Flow 画流程图 好处是可以方便的使用 Git 管理版本 st=>start: 开始 e=>end: 结束 c1=>condition: A c2=> ...