Lighting System Design UVA - 11400 dp 更换灯泡

题目链接:https://vjudge.net/problem/UVA-11400
紫书P275
题意:输入为电压、电源费用、灯泡单价、所需灯泡数量。电压低得灯泡可以被电压高的灯泡替换,求最小花费。
思路: 每种灯泡要么全换,要么全不换。 如果将一部分灯泡换成电压高单价低的灯泡,还需要花费电源钱,如果全部更换则不需要额外花费电源。先按照电压排序。dp【i】表示到第i种灯泡所需的最小花费。还要确定一点就是每次用一种灯泡代替另一种灯泡时,一定是连续替换的,不可能跳过某一种而更换下一种。比如1 2 3 4 ,枚举到5,用5替换了4则不可能跳过3替换2,如果没有替换3,那么说明3比5更好,也就是2已经被3替换,因而5不可能跳过3更换2.

#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
struct node
{
    int v,k,c,l;
    bool operator <(node &r)
    {
        return v<r.v;
    }
} nd[1005];
int dp[1005],s[1005];
int main()
{
    int t;
    int ans;
    while(cin>>t&&t)
    {
        memset(s,0,sizeof(s));
        memset(dp,0x3f,sizeof(dp));
        for(int i=1; i<=t; i++)
        {
            scanf("%d%d%d%d",&nd[i].v,&nd[i].k,&nd[i].c,&nd[i].l);
        }
        sort(nd+1,nd+t+1);
        for(int i=1; i<=t; i++)
        {
            s[i]=s[i-1]+nd[i].l;
        }
        dp[0]=0;
        for(int i=1; i<=t; i++)
        {
            for(int j=i-1; j>=0; j--)
            {
                dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*nd[i].c+nd[i].k);
            }
        }
        cout<<dp[t]<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值