Lighting System Design UVA 11400 (dp+思维)
題目大意:有一個照明系統需要用到n種燈,每種燈的電壓為V,電源費用K,每個燈泡費用為C,需要該燈的數量為L。注意到,電壓相同的燈泡只需要共享一個對應的電源即可,還有電壓低的燈泡可以被電壓高的燈泡替代。為了節約成本,你將設計一種系統,使之最便宜。
分析:首先需要明確一種燈泡要么全部換,要么不換。如果換一部分的話,首先電源費用得不到節約,那么節約的部分就只來自于換的那部分燈泡,既然可以節約錢干嘛不干脆全部換了呢?
明確了這點之后
我們應該對決策進行一定的限制: 求前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 <bits/stdc++.h> #define ll long long #define pb push_back #define inf 0x3f3f3f3f #define pll pair<ll,ll> #define rep(i,a,b) for(int i=a;i<=b;i++) #define rep1(i,a,b) for(int i=a;i>=b;i--) #define rson rt<<1|1,m+1,r #define lson rt<<1,l,m using namespace std; const int N=1e3+100; ll dp[N],s[N]; struct node {ll v,k,c,l; }app[N]; bool cmp(node a,node b) {return a.v<b.v; } int main() {ios::sync_with_stdio(false );int n;while(cin>>n&&n){rep(i,1,n)cin>>app[i].v>>app[i].k>>app[i].c>>app[i].l;sort(app+1,app+1+n,cmp);rep(i,1,n)s[i]=s[i-1]+app[i].l;rep(i,1,n){dp[i]=app[i].k+app[i].c*s[i];rep(j,0,i-1)dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*app[i].c+app[i].k);}cout<<dp[n]<<endl;}return 0; }轉載于:https://www.cnblogs.com/ffgcc/p/10546410.html
總結
以上是生活随笔為你收集整理的Lighting System Design UVA 11400 (dp+思维)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP内核探索之变量(6)- 后续内核探
- 下一篇: tomcat安装与项目部署