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+5]; int K[maxn+5]; int C[maxn+5]; int L[maxn+5]; int id[maxn+5]; int s[maxn+5]; int d[maxn+5]; bool cmp(int a,int b){ return V[a]<V[b]; } int dp(int i){ int ans=100000000; for(int j=0;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)==1&&n){ for(int i=1;i<=n;i++) scanf("%d%d%d%d",&V[i],&K[i],&C[i],&L[i]); for(int i=0;i<=n;i++) id[i]=i; sort(id+1,id+1+n,cmp); s[0]=0; for(int i=1;i<=n;i++) s[i]=s[i-1]+L[id[i]]; d[0]=0; for(int i=1;i<=n;i++) d[i]=dp(i); printf("%d\n",d ); } return 0; }
- 2016.5.19渗透经验总结
- 【结论】【数论】拓展欧几里得算法、费马小定理
- STM32的USB速度,终于确定了传输极限,为以后的产品设计提供了数据。
- <<js>>每个函数都有作用域链
- 【二分】【高精度】Vijos P1472 教主的集合序列
- 实战ItemTouchHelper仿网易新闻客户端自定义栏目页面
- 上位机用USB做虚拟串口,总算抓到一个纯代码的总结了,没有坑的完美解决。
- 浅谈SSO及web开发基础
- 自定义继承ListView控件实现下拉刷新底部加载的实现
- STM32的bulk双缓冲传输速度的讨论,硬件的坑永远填不完
- 更新到Xcode 7.3,iOS 9.3 SDK后,Theos导入private framework编译时报错的解决方案
- dual vector space
- javaEE是什么
- I2C和LCD信号干扰的解决:硬件工程师都硬不起来,让软件工程师硬着头上
- Gt9xx芯片,在规格书+Linux驱动的基础上,移植为USB裸机经验。直接用开发板,不去碰硬件的坑。
- Think Android 的数据库用法(一)
- 【乘法逆元】1256 乘法逆元【51nod】【难度:基础题】
- WIN7下USB多点触摸,一次发多个数据包的延迟问题,重要!
- 每秒处理10万订单乐视集团支付架构
- win7 多点触摸USB的触摸屏