思路:dp[i]=min(dp[j]+(s[i]-s[j])*c[i]+k[i],dp[i]),其中dp[i]表示到i的灯泡所需要花费的最小开销。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1010;
const int inf =0x3f3f3f;
typedef long long ll;
int n;
struct lamp
{
int v,k,c,l;
};
lamp node[maxn];
int dp[maxn<<2],s[maxn<<2];
bool cmp(lamp a,lamp b)
{
return a.v<b.v;
}
int main()
{
// freopen("out","w",stdout);
while(~scanf("%d",&n) && n)
{
memset(dp,0,sizeof(dp));
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++)
scanf("%d%d%d%d",&node[i].v,&node[i].k,&node[i].c,&node[i].l);
sort(node+1,node+n+1,cmp);
for(int i=1;i<=n;i++)
s[i]=s[i-1]+node[i].l;
int j=0;
for(int i=1;i<=n;i++)
{
dp[i]=node[i].k+node[i].c*s[i];
for(int j=1;j<i;j++)
{
dp[i]=min(dp[j]+(s[i]-s[j])*node[i].c+node[i].k,dp[i]);
}
}
printf("%d\n",dp[n]);
}
return 0;
}