UVA 11400(DP)
来源:互联网 发布:九思软件 编辑:程序博客网 时间:2024/04/29 13:57
题意给定n种类型灯泡,每个灯泡给出其电压v,电源花费k,每个灯的花费c和需求量l,现在通过用电压大的灯泡替换某些电压小的灯泡来减小总花费,求最小的花费。
首先要说明的是,为求得最小花费,对于某种灯泡,要么全部替换,要么全不替换,这个很容易证明。
这个问题难就难在如何找子问题。如果先按灯泡电压把灯泡从小到大进行排序,定义dp[i]为替换第i种灯泡后前i种灯泡的最小花费,因为对一种替换情况,不知道用来替换的灯泡后来会不会再用,如果不用相当于不替换的情况下多用了一个电源,这样不一定会达到最优,所以这样定义不行。这样当前的决策会影响到后面的决策。对于这种情况,我们应该对决策进行一定的限制: 求前i个灯泡的最小花费时,只允许用第i种灯泡进行替换! 如何替换呢? 只能替换1 到i 中序号连续的灯泡!!! 即决策应为选择一个j,替换掉序号为 j 到i - 1的所有灯泡,使得前i号灯泡花费最小。那么最终 dp[n]即为答案。即d[i]为只考虑前i种灯泡的最小花费,状态转移方程:d[i] = min{d[i] + (s[i] - s[j]) * c[i] + k[i]} 其中s[i]为前i种灯泡的总数量。
但这样做是否正确呢,首先上面的方法在求前i 个灯泡的最小花费时,只能用第i个灯泡替换,这样并不影响,因为通过循环所有的灯泡都会用来替换。 问题关键是只考虑替换连续区间的灯泡造成解丢失的情况。比如说会不会出现最优解是序号为1, 3的灯泡被一种灯泡替换,序号为2的被另一种替换或不被替换。 假设这种情况下是最小花费,那么替换序号2的灯泡的单价一定小于替换序号1的灯泡的单价,否则不会是最小值,既然替换序号2的灯泡的单价小于替换序号1的灯泡的单价,那么用替换2的灯泡去替换灯泡1,就会产生更小的花费,这与假设向矛盾,所以假设不成立,即前面的决策不会漏掉答案。代码如下:
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int MAXN = 1010;struct Lamb{ int v; int c; int l; int k;};Lamb la[MAXN];int s[MAXN], n, dp[MAXN];bool camp(Lamb a, Lamb b){ return a.v < b.v;}int main(){ while(true) { scanf("%d", &n); if(!n) break; int i, j; for(i = 1; i <= n; i++) scanf("%d%d%d%d", &la[i].v, &la[i].k, &la[i].c, &la[i].l); sort(la+1, la+n+1, camp); for(i = 1; i <= n; i++) { s[i] = s[i - 1] + la[i].l; } for(i = 1; i <= n; i++) { dp[i] = la[i].k + la[i].c * s[i]; //初始化为全部换为第i个灯泡的价值。 for(j = 1; j < i; j++) { dp[i] = min(dp[i], dp[j] + (s[i] - s[j]) * la[i].c + la[i].k); } } printf("%d\n", dp[n]); } return 0;}
- UVA 11400(DP)
- uva 11400 DP 需要推理
- uva 11400 Lighting System Design (dp)
- uva 11400 Lighting System Design (DP)
- uva 11400 - Lighting System Design(dp+贪心)
- Lighting System Design - UVa 11400 dp
- UVA 11400 Lighting System Design DP
- UVa 11400 Lighting System Design(DP)
- uva 11400 Lighting System Design dp
- UVa 11400 - Lighting System Design(DP)
- UVa 11400 - Lighting System Design(DP)
- UVa 11400:Lighting System Design(DP)
- UVa 11400- Lighting SystemDesign(DP)
- UVA 11400 Lighting System Design DP
- uva 11400 Lighting System Design(dp~)
- UVA 11400 Lighting System Design (DP)
- UVA 11400 Lighting System Design 【贪心】【DP】
- UVA DP 入门专题
- 如何查看笔记本电脑的型号?
- java.lang.IllegalArgumentException的解决
- Eclipse 常用快捷键
- Android中TextView文字居中与垂直靠左居中
- adb not responding. if you'd like to retry then please manually kill adb.exe and click 'restart' 解决办
- UVA 11400(DP)
- 顺序表的查找
- STM32积累
- stm32常见问题
- 黑马程序员—— 9,包package相关知识点
- C++ 编译,运行过程 详解。
- Ubuntu下重置Mysql root用户的密码
- iOS 数组遍历删除元素的问题
- POJ1077 HDU1043 Eight 八数码 (A*+康托展开)