#include<stdio.h>
#include<string.h>
#include<algorithm>
///题解在下面
using namespace std;
#define N 100005
#define inf 0x3f3f3f3f
int dp[N];
struct data
{
int v,k,c,l;///电压 电源费用 灯泡费用 数量
friend bool operator <(data a,data b)
{
return a.v<b.v;
}
} a[N];
int num[N];
int main()
{
int n;
while(scanf("%d",&n),n)
{
memset(dp,inf,sizeof(dp));
for(int i=1; i<=n; i++)
{
scanf("%d%d%d%d",&a[i].v,&a[i].k,&a[i].c,&a[i].l);
}
sort(a+1,a+1+n);
num[0]=0;
for(int i=1; i<=n; i++)
{
num[i]=num[i-1]+a[i].l;
}
dp[1]=0;
for(int i=1; i<=n; i++)
{
dp[i]=num[i]*a[i].c+a[i].k;
for(int j=0; j<i; j++)
{
dp[i]=min(dp[i],dp[j]+(num[i]-num[j])*a[i].c+a[i].k);
}
}
printf("%d\n",dp[n]);
}
}
以上是AC 代码。
对电压进行排序
存储每一种从前到后每一种灯泡所需要的数量和
dp[i] 是指 1 - i 灯泡安排完成的最少花费。
替换的时候从 j - i 全部替换成 灯泡 i 然后+ dp【i-1】
询问:会不会漏情况?
答案 : 不会的。
证明:
假设我们用4 替换 1 3 比 替换 1 2 3 划算
也就是 现在已经替换 2 的灯泡(或者是他本身)比 4 的价值更低。
但是 1 的价值要比 4 的高。
但是 1 2 已经完成过替换了
所以 2 的价值 > = 1 的价值
所以我们一开始的假设不成立
所以啦不会漏情况