UVa11400 - Lighting System Design——[动态规划]
题干略。
题意分析:
很容易理解一类灯泡要么全部换要么全不换,其实费用节省的主要原因是由于替换灯泡类型而排除了低压电压源,于是我们就可以推断出灯泡类型替换的原则:
对于两类灯泡a1和a2,a1可以被a2替换的条件是:
1) v2>v1
2)a2一定存在于最优解中(保证K2不被省去)
3)C2*L1 - C1*L1 - K1<0
基于以上替换原则首先将所有灯泡a1,a2,……,an 按电压非降序排列,我们可以假定状态d[i]为仅考虑前1~i个灯泡时的最优解(最小费用)。在计算d[i]时仅考虑用ai替换,ai一定存在于最优解中,满足条件(1)(2)。那么问题来了,采用何种替换方法呢?下面我们考虑[i-1]的最优解情况:
假设前i-1个灯泡经过最优的替换后灯泡序列为b1,……,bj,bj+1,……bk(电压非降序排列);
经分析bj和bj+1的关系一定满足:(1)Cj+1*Lj-Cj*Lj-Kj>0(否则bj可被bj+1替换,与当前为最优解的假设矛盾)。
现在我们考虑用第i个灯泡 ai 替换的情况,假设bj可以被ai替换,那么有(2)Ci*Lj-Cj*Lj-Kj<0
由不等式(1)(2)可知 Ci<Cj+1,即 Ci*Lj+1-Cj+1*Lj+1-Kj+1<0, bj+1一定可以被ai替换,
同理,bj~bk的所有灯泡都可以被ai替换,换句话说,在i-1个灯泡的最优替换序列 b1~aj~bk 中,如果存在 j(1<j<i-1),aj+1可以被ai替换,那么
aj+1~bk的所有灯泡都可以被ai替换;a1~aj个灯泡的最小费用已经算出为d[j]。这样我们就得出了ai的替换方法:前j个灯泡用之前计算出的最优方案d[j]购买,剩下j+1~i个灯泡全用ai替换,枚举j从0到i-1,,根据前面的讨论得知不会漏解,则状态转移方程 d[j]=min{ d[j]+c[i]*(s[i]-s[j])+k[i] | j from 0 to i-1 },s[i]为前i类灯泡的总数目。
代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 1000
int n;
int V[maxn+];
int K[maxn+];
int C[maxn+];
int L[maxn+];
int id[maxn+];
int s[maxn+];
int d[maxn+];
bool cmp(int a,int b){
return V[a]<V[b];
}
int dp(int i){
int ans=;
for(int j=;j<i;j++)
ans=min(ans,d[j]+C[id[i]]*(s[i]-s[j])+K[id[i]]);
return ans;
}
int main(int argc, const char * argv[]) {
while(scanf("%d",&n)==&&n){
for(int i=;i<=n;i++)
scanf("%d%d%d%d",&V[i],&K[i],&C[i],&L[i]);
for(int i=;i<=n;i++)
id[i]=i;
sort(id+,id++n,cmp);
s[]=;
for(int i=;i<=n;i++)
s[i]=s[i-]+L[id[i]];
d[]=;
for(int i=;i<=n;i++)
d[i]=dp(i);
printf("%d\n",d[n]);
}
return ;
}
UVa11400 - Lighting System Design——[动态规划]的更多相关文章
- UVA11400 Lighting System Design(DP)
You are given the task to design a lighting system for a huge conference hall. After doing a lot of ...
- 【Uva11400 Lighting System Design】动态规划
分析 先按照电压从小到大排序,做一下前缀和s[i]求i之前的电灯泡的数量. 状态:$ F_i\(表示到\) i$个灯泡的最小开销. 状态转移方程:$ F_i=F_j+(s[i]-s[j])\times ...
- uva11400 Lighting System Design
题目大意: 有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L.注意到,电压相同的灯泡只需要共享一个对应的电源即可,还有电压低的灯泡可以被电压高的灯泡替代 ...
- 【线性结构上的动态规划】UVa 11400 - Lighting System Design
Problem F Lighting System Design Input: Standard Input Output: Standard Output You are given the tas ...
- (动态规划)UVA-11400:Lighting System Design
You are given the task to design a lighting system for a huge conference hall. After doing a lot of ...
- UVa 11400 Lighting System Design(DP 照明设计)
意甲冠军 地方照明系统设计 总共需要n不同类型的灯泡 然后进入 每个灯电压v 相应电压电源的价格k 每一个灯泡的价格c 须要这样的灯泡的数量l 电压低的灯泡能够用电压高的灯泡替换 ...
- UVA - 11400 Lighting System Design
题文: You are given the task to design a lighting system for a huge conference hall. After doing a lot ...
- Lighting System Design UVA - 11400 动态规划
题目:题目链接 思路:简单的动态规划问题,先把灯泡按照电压从小到大排序.设s[i]为前i种灯泡的总数量(即L值之和),d[i]为灯 泡1-i的最小开销,则d[i] = min{d[j] + (s[i] ...
- 【神仙DP】【UVa11400】Lighting System Design
传送门 Description Translation 题目大意:有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L.注意到,电压相同的灯泡只需要共享一个 ...
随机推荐
- js实现翻转一个字符串
字符串作在程序中是非常常见的,因为程序中绝大部分的数据都可以当作字符串来处理.在这里介绍几种翻转字符串的方法. (1)使用字符串函数 //使用数组翻转函数 function reverseString ...
- python 中初始化二维数组的方法
最好的方法是: 初始化4*3的二维数组 a = [[0 for col in xrange(3)] for row in xrange(4)] 而不可以用: a = [[0]*3]*4 [0]*3是生 ...
- tes..
力扣刷题 二分查找法 二分查找法又称折半查找法. 优点:比较次数少,查找速度快,平均性能好: 缺点:要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 首先 ...
- 扩展 Microsoft.Owin.Security
微软在 OWIN 框架中对 OAuth 认证的支持非常好, 使用现有的 OWIN 中间件可以做到: 使用 Microsoft.Owin.Security.OAuth 搭建自己的 OAuth2 服务端, ...
- 【模板】树的重心 洛谷P1364 医院设置
P1364 医院设置 题目描述 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接 ...
- Codeforces 293B Distinct Paths DFS+剪枝+状压
目录 题面 题目链接 题意翻译 输入输出样例 输入样例#1 输出样例#1 输入样例#2 输出样例#2 输入样例#3 输出样例#3 输入样例#4 输出样例#4 说明 思路 AC代码 总结 题面 题目链接 ...
- if (donutString.indexOf("dozen") != -1)是什么意思
if (donutString.indexOf("dozen") != -1)是什么意思 function parseDonuts(donutString) { numDonuts ...
- Sum Root to Leaf Numbers深度优先计算路径和
Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...
- Directx11教程(57) 环境映射
原文:Directx11教程(57) 环境映射 建好skydome后,如果我们想让其中的某个物体,比如那个球体来映射出周围环境的蓝天白云(不包括自己附近的物体),该怎么做呢?此时可以把这个 ...
- Android Binder设计与实现 – 设计篇
摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...