HDU 6024 Building Shops

$dp$。

$dp[i]$表示到$i$位置,且$i$位置建立了的最小花费,那么$dp[i] = min(dp[k]+cost[i+1][k-1])$,$k$是上一个建的位置。最后枚举$dp[i]$,加上最后一段的花费,取个最小值即可。

#include <bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
const long long inf=1e18;
int n;
struct X
{
    long long pos;
    long long cost;
}s[5000];

bool cmp(X a,X b)
{
    return a.pos<b.pos;
}
long long len[5000],dp[5000];

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%lld%lld",&s[i].pos,&s[i].cost);
        }
        sort(s+1,s+1+n,cmp);
        len[0]=0;
        for(int i=1;i<=n;i++)
        {
            len[i]=len[i-1]+s[i].pos-s[1].pos;
        }
        for(int i=1;i<=n;i++) dp[i]=inf;
        dp[1]=s[1].cost;
        for(int i=2;i<=n;i++)
        {

            for(int j=1;j<i;j++)
            {
                if(j==i-1)
                    dp[i]=min(dp[i],dp[j]+s[i].cost);
                else
                    dp[i]=min(dp[i],s[i].cost+dp[j]+len[i-1]-len[j]-(i-1-j)*(s[j].pos-s[1].pos));
            }
        }
        long long ans=inf;
        for(int i=1;i<=n;i++)
        {
            if(i==n) ans=min(ans,dp[n]);
            else ans=min(ans,dp[i]+len[n]-len[i]-(n-i)*(s[i].pos-s[1].pos));
        }
        printf("%lld\n",ans);
    }
    return 0;
}
时间: 2024-10-26 22:41:50

HDU 6024 Building Shops的相关文章

hdu 6024 Building Shops(dp)

题目链接:hdu 6024 Building Shops 题意: 要在n个点上建若干小卖店,每个点建造小卖店的消费为cost[i],如果这个点没有建造小卖店,那么这个点的费用为和左边最近的点的坐标差. 求总的最小费用. 题解: 首先,第一个点必须建造,然后对于第i个点: dp[i]=min(dp[i],sum[i]-sum[j]-(i-j)*(id[i]-id[j]+dp[j-1]+cost[j]);(1<=j<=i) 其中: id[i]表示第i个点的坐标. sum[i]=id[i]-id[1

HDU 5033 Building(北京网络赛B题)

HDU 5033 Building 题目链接 思路:利用单调栈维护建筑建的斜线,保持斜率单调性,然后可以把查询当成高度为0的建筑,和建筑和在一起考虑,从左往右和从右往左各扫一遍即可 代码: #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <algorithm> using namespace std; const int N = 200

hdu 5033 Building(单调性+二分)

题目链接:hdu 5033 Building 题目大意:城市里有n座摩天大厦,给定每栋大厦的位置和高度,假定大厦的宽度为0.现在有q次查询,表示人站的位置,人的高度视为0,问说可以仰望天空的角度. 解题思路:比赛的时候用单调性优化直接给过了,对于每个大厦来说,记录左右两边与其形成斜率最大的大厦序号以及斜率,然后每次查询是,通过二分确认人所在位置属于哪两栋大厦之间,然后分别向左向右确认角度,在确认角度时,根据大厦记录的最大斜率进行判断. 以左边为例, 然后对于查询位置x: 这种解法仅仅是优化查询效

hdu 2818 Building Block(带权并查集)

题目: 链接:点击打开链接 题意: 有N个积木,1到N编号.进行一些操作P次,M:X Y把X积木放到Y的上面,如果X和Y相等请忽略.C:X 计算X积木下的积木数目. 思路: 带权并查集的题目,定义数组sum[i]表示i积木下面积木的数目.遇到操作M,就把X和Y合并到同一个集合中.我们视每个结点为1个 Pile,其中rank[i]就表示每个Pile处的积木的个数,Initially, there are N piles, and each pile contains one block.所以,ra

(hdu 6024) Building Shops

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6024 Problem Description HDU's n classrooms are on a line ,which can be considered as a number line. Each classroom has a coordinate. Now Little Q wants to build several candy shops in these n classrooms

HDU 5033 Building

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5033 解题报告:在一条x轴上有n个建筑物,每个建筑物有一个高度h,然后现在有q次查询,查询的内容是假设有一个人站在xi这个位置,问他看天空的视角是多大,用角度表示. 数据量都比较大,n和q都是10^5,但因为q次都是查询操作,并没有要求在线更新和查询,所以我们想到用离线算法,先把全部的输入接收,然后离线算出最后打出结果. 这题的思路是把所有的建筑物按照高度从大到小排序,然后所有的查询按照x从小到大排

hdu 5033 Building(斜率优化)

Building Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1237    Accepted Submission(s): 350 Special Judge Problem Description Once upon a time Matt went to a small town. The town was so sma

BC#34 1002 hdu 5192 Building Blocks

Building Blocks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 60    Accepted Submission(s): 6 Problem Description After enjoying the movie,LeLe went home alone. LeLe decided to build blocks.

hdu 1815 Building roads

Building roads Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 822    Accepted Submission(s): 239 Problem Description Farmer John's farm has N barns, and there are some cows that live in each b