例题9-6 UVa11400 Lighting System Design(DP)

题意:

看白书

要点:

其他的白书上讲的比较清楚了,状态转移方程为:d[i] = min(d[i], d[j] + (s[i] - s[j])*bulb[i].c + bulb[i].k),有点难以理解的是如果i到j之中有的不进行换比较合理怎么办?但其实这种情况是不存在的,这个博客进行了详细的数学推导:点击打开链接

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int d[1005], s[1005];
typedef struct node
{
	int v, k, c, l;
}node;
node bulb[1005];

bool cmp(node a, node b)
{
	return a.v < b.v;
}

int main()
{
	int n,i,j;
	while (scanf("%d", &n) && n)
	{
		for (i = 1; i <= n; i++)
			scanf("%d%d%d%d", &bulb[i].v,&bulb[i].k,&bulb[i].c,&bulb[i].l);
		sort(bulb + 1, bulb + 1 + n, cmp);
		memset(d, inf, sizeof(d));
		memset(s, 0, sizeof(s));
		d[0] = 0;
		for (i = 1; i <= n; i++)
			s[i] = s[i - 1] + bulb[i].l;
		for (i = 1; i <= n; i++)
			for (j = 0; j < i; j++)
				d[i] = min(d[i], d[j] + (s[i] - s[j])*bulb[i].c + bulb[i].k);
		printf("%d\n", d[n]);
	}
	return 0;
}


posted @ 2016-05-21 21:34  seasonal  阅读(133)  评论(0编辑  收藏  举报