1. 程式人生 > >線性結構上的動態規劃

線性結構上的動態規劃

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;
16 } 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 }
View Code

線性結構上的動態規劃