紫书动规 例题9-6 UVA - 11400 Lighting System Design dp

2019-07-14 01:38发布

题目链接:

https://vjudge.net/problem/UVA-11400

题意:

题解:

按照电压从小到大排序,一种灯泡要么不换,要么全换; 否则依旧是两个电源,没省钱。
因为可能电压高的费用小,肯定全换,并且还可以剩下一个电源费用
还可能电压高的费用大,那也要全换,跑一跑,取最小值,因为可能电源费用省的更多那。 dp[i]:=前i个的最小费用
dp[i] = min(dp[i],dp[j]+(s[i]-s[j])*a[i].c+a[i].k); 一定要排序之后再求前缀和…

代码:

#include using namespace std; typedef long long ll; #define MS(a) memset(a,0,sizeof(a)) #define MP make_pair #define PB push_back const int INF = 0x3f3f3f3f; const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } ////////////////////////////////////////////////////////////////////////// const int maxn = 1e5+10; int n,dp[maxn]; int s[maxn]; struct node{ int v,k,c,l; bool operator<(const node& rhs)const{ return v < rhs.v; } }a[maxn]; int main(){ while(scanf("%d",&n) && n){ s[0] = 0; 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); for(int i=1; i<=n; i++) s[i] = s[i-1]+a[i].l; dp[0] = 0; for(int i=1; i<=n; i++){ dp[i] = dp[i-1]+ a[i].l*a[i].c+a[i].k; for(int j=0; jreturn 0; }