zoukankan      html  css  js  c++  java
  • HDOJ 6024 动态规划

    链接:

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

    题意:

    有一排教室位置xi,每个教室可以建一个蛋糕店,花费为ci,对于每一个位置,如果建了蛋糕店,那么花费ci,否则找到他左边第一个建蛋糕店的教室,花费为他们之间的距离

    所以就是说最左边的教室一定要有一个蛋糕店,题目上说每个没有建蛋糕店的教室左边必须要有一个建蛋糕店的教室

    题解:

    dp[i][0]表示到第i个教室,第i个教室没有建蛋糕店的最小值,dp[i][1]表示第i个教室建了蛋糕店的最小值。转移方程见代码

    还有最麻烦的就是使用sum数组,sum表示前缀和,表示从第0个到第i个之间都没有建蛋糕店的花费,然后就能计算任意两个蛋糕店之间没有建蛋糕店的花费了,计算方法画一下就知道了

    代码:

    31 pair<ll, ll> c[3030];
    32 ll sum[3030];
    33 ll dp[3030][2];
    34 
    35 int main() {
    36     ios::sync_with_stdio(false), cin.tie(0);
    37     int n;
    38     while (cin >> n) {
    39         rep(i, 0, n) cin >> c[i].first >> c[i].second;
    40         memset(sum, 0, sizeof(sum));
    41         rep(i, 0, 3030) dp[i][0] = dp[i][1] = 1e18;
    42         sort(c, c + n);
    43         rep(i, 1, n) sum[i] = sum[i - 1] + c[i].first - c[0].first;
    44         dp[0][1] = c[0].second;
    45         rep(i, 1, n) {
    46             dp[i][1] = min(dp[i - 1][0], dp[i - 1][1]) + c[i].second;
    47             rep(j, 0, i) dp[i][0] = min(dp[i][0], dp[j][1] + sum[i] - sum[j] - (c[j].first - c[0].first)*(i - j));
    48         }
    49         cout << min(dp[n - 1][0], dp[n - 1][1]) << endl;
    50     }
    51     return 0;
    52 }
  • 相关阅读:
    C# 从服务器下载文件
    不能使用联机NuGet 程序包
    NPOI之Excel——合并单元格、设置样式、输入公式
    jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
    UVA 10519 !! Really Strange !!
    UVA 10359 Tiling
    UVA 10940 Throwing cards away II
    UVA 10079 Pizze Cutting
    UVA 763 Fibinary Numbers
    UVA 10229 Modular Fibonacci
  • 原文地址:https://www.cnblogs.com/baocong/p/7214586.html
Copyright © 2011-2022 走看看