• HDU 1421 搬寝室


    这个题目想了一天,最后还是看的题解。

    http://www.acmerblog.com/hdu-1421-%E6%90%AC%E5%AF%9D%E5%AE%A4-1891.html

    还是没有dp的解题思想,受上一题影响老是想着转化成数塔形式,结果走了不少弯路。

    第一感觉还是准的,首先按质量对这n件物品排序,然后每取两件物品,这两件物品必然相邻。

    dp[i][j]表示前i件物品取j组的最小疲劳度。

    那么分析一下状态转移方程:

    如果i == j * 2,那么就是前n件物品全取,所以dp[i][j] = dp[i - 2][j - 1] + c,这里c = (a[i] - a[i - 1]) * (a[i] - a[i - 1]);

    否则,对于这第i件物品有取和不取两种情况。

    1、取,那么一定是取a[i-1]和a[i],两件物品,dp[i][j] = dp[i-2][j-1] + c;

    2、不取,dp[i][j] = dp[i-1][j];

    所以dp[i][j] = min(dp[i][j] = dp[i - 2][j - 1] + c, dp[i-1][j]);

    空间上的优化:因为在每个i循环里都只用到dp[i-2]dp[i-1]dp[1]这三个数组,所以把前面不用的“折叠掉”。然后对这三项模3取余即可。

    具体参见代码。

     1 //#define LOCAL
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int maxn = 2000 + 20;
     9 int dp[3][maxn];
    10 int a[maxn];
    11 
    12 int main(void)
    13 {
    14     #ifdef LOCAL
    15         freopen("1421in.txt", "r", stdin);
    16     #endif
    17 
    18     int n, k;
    19     while(scanf("%d %d", &n, &k) == 2)
    20     {
    21         int i;
    22         memset(dp, 0, sizeof(dp));
    23         for(i = 1; i <= n; ++i)
    24             scanf("%d", &a[i]);
    25         sort(a + 1, a + n + 1);
    26 
    27         for(i = 2; i <= n; ++i)
    28         {
    29             int c = (a[i] - a[i - 1]) * (a[i] - a[i - 1]);
    30             for(int j = 1; j <= k && j * 2 <= i; ++j)
    31             {
    32                 if(j * 2 == i)
    33                     dp[i % 3][j] = dp[(i - 2) % 3][j - 1] + c;
    34                 else
    35                     dp[i % 3][j] = min(dp[(i - 1) % 3][j], dp[(i - 2) % 3][j - 1] + c);
    36             }
    37         }
    38         cout << dp[n % 3][k] << endl;
    39     }
    40     return 0;
    41 }
    代码君
  • 相关阅读:
    第三个实验代码
    20165104孟凡斌-第五周作业
    20165104孟凡斌-第四周作业
    20165104孟凡斌-第二次java考试课下作业
    20165104孟凡斌-第三周作业
    20165104孟凡斌-第二次JAVA作业
    20165104孟凡斌-第一次Java考试课下作业
    2018-2019-1 《信息安全系统设计基础》 20165235 实验五 通信协议设计
    2018-2019-1 20165235 实验四 外设驱动程序设计
    20165235 实现pwd功能
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3823522.html
Copyright © 2020-2023  润新知