線性結構上的動態規劃
阿新 • • 發佈:2017-07-30
nbsp style get namespace target 一個 max close algo
UVA11400
分析:首先我們需要明白一個問題,就是每種電壓的燈泡要麽就是全部替換,要麽全部不替換,為什麽呢?因為如果只替換一半,那兩種電源都需要,不劃算,從另一個方面來說,既然轉化一半會比原來小,那為什麽不全部轉換呢?接著根據題意我們應該把燈泡按照電壓從小到大排序。然後我們令dp[i]表示1~i的最小開銷,令sum[i]表示前i種燈泡的數量,則dp[i]=min(dp[j]+(sum[i]-sum[j])*p[i].c+p[i].k),表示前j個先用最優方案,然後j+1~i換成第i號電源。有人會問這樣是否會漏解,比如第i個,只替換我們1,3,5這樣子的,但是這種情況是不存在的,為什麽呢?設i<j<k,如果i替換成k,而j沒有替換,說明j是更優的,那i為什麽不轉移到j呢?
1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 #include "algorithm" 6 using namespace std; 7 const int maxn=1000+10; 8 const int INF=1<<30; 9 struct Node{ 10 int v,k,c,l; 11 }; 12 Node p[maxn]; 13 int n; 14 bool cmp(Node a,Node b){ 15 return a.v<b.v;View Code16 } 17 int sum[maxn]; 18 int dp[maxn]; 19 int main() 20 { 21 while(cin>>n) 22 { 23 if(n==0) break; 24 for(int i=1;i<=n;i++){ 25 cin>>p[i].v>>p[i].k>>p[i].c>>p[i].l; 26 } 27 sort(p+1,p+1+n,cmp); 28 for(int i=1;i<=n;i++) 29 sum[i]=sum[i-1]+p[i].l; 30 dp[0]=0; 31 for(int i=1;i<=n;i++){ 32 dp[i]=INF; 33 for(int j=0;j<=i;j++){ 34 dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j])*p[i].c+p[i].k); 35 } 36 } 37 cout<<dp[n]<<endl; 38 } 39 return 0; 40 }
線性結構上的動態規劃