【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;
}
posted @ 2018-09-28 14:33  shellpicker  阅读(165)  评论(0编辑  收藏  举报