hdu 6024 Building Shops dp

来源:互联网 发布:网络包装公司是干嘛的 编辑:程序博客网 时间:2024/06/16 22:12

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=6024

题意:

有n间教室,要选一些建商店,对于每间教室,如果选中在这间教室建商店,会给出一个花费,如果没有选中,那么也有一个花费,就是这间教室到左边最近的商店的距离。要求当一间教室没有建设商店时,那么它左边一定有一个商店。求最小花费

思路:

根据题意,第一间教室一定要建商店。定义dp[0][i]为第i间教室不建商店时,从1~i的最小花费,dp[1][i]为第i间教室建商店时,从1~i的最小花费,容易推出

dp[1][i]=min(dp[0][i],dp[1][i])+cost

dp[0][i]=min(dp[1][j]+sum)(1<=j<=i1,sum=(xixj)+(xi1xj)+...(xj+1xj))

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 10000 + 10, INF = 0x3f3f3f3f, mod = 1e9 + 7;struct node{    int x, y;}arr[N];ll dp[2][N];int main(){    int n;    while(~ scanf("%d", &n))    {        for(int i = 1; i <= n; i++) scanf("%d%d", &arr[i].x, &arr[i].y);        sort(arr + 1, arr + 1 + n, [](node a, node b){return a.x < b.x;});        memset(dp, 0x3f, sizeof dp);        dp[1][1] = arr[1].y;        for(int i = 2; i <= n; i++)        {            dp[1][i] = min(dp[0][i-1], dp[1][i-1]) + arr[i].y;            ll val = 0;            for(int j = i-1; j >= 1; j--)            {                val += 1LL * (i-j) * (arr[j+1].x - arr[j].x);                dp[0][i] = min(dp[0][i], dp[1][j] + val);            }        }        printf("%lld\n", min(dp[0][n], dp[1][n]));    }    return 0;}
原创粉丝点击