zoukankan      html  css  js  c++  java
  • hdu1421 搬寝室(dp)

    此题是动态规划题。

    解题思路:

    用w[i]存储n个物品的重量,对其进行排序。

    那么当取了第i个物品,必然会取第i-1个物品。

    令dp[i][j]表示前i个物品,取j对的最小疲劳度。

    若取第i个物品

    则:dp[i][j]=dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]);

    若不取第i个物品

    则:dp[i][j]=dp[i-1][j];

    所以状态转移方程为:dp[i][j]=min(dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]),dp[i-1][j]);

    代码:

    #include "stdio.h"
    #include "math.h"
    #include "queue"
    #include "stdlib.h"
    #include "string.h"
    #include "algorithm"
    #include "iostream"
    #define N 100010
    #define inf 2147483646
    #define eps 1e-8
    #define pi acos(-1.0)
    using namespace std;
    int dp[2005][1005];
    int main()
    {
        int n,k,i,j;
        int w[2005];
        while(cin>>n>>k)
        {
            w[0]=0;
            for(i=1;i<=n;i++)
                cin>>w[i];
            sort(w,w+n+1);
            for(i=0;i<=n;i++)
                for(j=1;j<=k;j++)
                dp[i][j]=inf;
            dp[0][0]=0;
            for(i=2;i<=n;i++)
            {
                for(j=1;j*2<=i;j++)
                {
                    dp[i][j]=min(dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]),dp[i-1][j]);
                }
            }
            cout<<dp[n][k]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    HDU2222 自动机(学习中)
    POJ 2289(多重匹配+二分)
    POJ 1486二分图的必要边
    二分图
    2015陕西 并查集
    Hdu2680 最短路
    函数调用约定
    用01随机函数构造[a,b]整数范围随机数
    hello
    Ubuntu 16.04 install R language
  • 原文地址:https://www.cnblogs.com/dj3839/p/5167338.html
Copyright © 2011-2022 走看看