【UVA】11400 照明系统设计 排序+dp
题目中有一个重要的信息是:每一种灯泡只能换成比它电压更大的灯泡,因此电压的大小限制了状态的转移。因此,在这里按照电压从小到大把每种灯泡排序,使得在考虑后面的灯泡时,前面的灯泡自然可以换成后面的灯泡。状态转移方程为\(dp[i]=max(dp[j]+(s[i]-s[j])*c[i]+k[i]),j\in[0,i-1]\),s[i] 表示前 i 种灯泡的数量。
代码如下:
#include <bits/stdc++.h>
#define cls(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1010;
int n,dp[maxn],s[maxn];
struct node{
int volt,src,cost,num;
}l[maxn];
bool cmp(const node& x,const node& y){
return x.volt<y.volt;
}
void init(){
cls(dp,0x3f);cls(l,0);cls(s,0);
}
int main(){
while(scanf("%d",&n)&&n){
init();
for(int i=1;i<=n;i++)
scanf("%d%d%d%d",&l[i].volt,&l[i].src,&l[i].cost,&l[i].num);
dp[0]=0;
sort(l+1,l+n+1,cmp);
for(int i=1;i<=n;i++)
s[i]=s[i-1]+l[i].num;
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*l[i].cost+l[i].src);
printf("%d\n",dp[n]);
}
return 0;
}