HDU1421

//dp 给定n个数字和k,求找出k对数字使得所有对数字差的平方和最小
//先给其从小到大进行排序,可知选取规则必须是选取相邻的两个数
//状态 dp[i][j]表示从前i个数选j组差的平方和最小
//当j*2==i时即i个数必须选完dp[i][j]=dp[i-2][j-1]+(a[i-1]-a[i])*(a[i-1]-a[i])
//否则dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i-1]-a[i])*(a[i-1]-a[i]))

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int a[2005];
long long dp[2005][1005];
int main()
{
    int n,k;
    while(cin>>n>>k)
    {
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        sort(a+1,a+n+1);
        for(int i=1;i<=2002;i++)
            for(int j=1;j<=1002;j++)
                dp[i][j]=0;
        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<=k&&2*j<=i;j++)
            {
                if(j*2==i)
                    dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]);
                else
                    dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]));
            }
        }
        cout<<dp[n][k]<<endl;
    }
    return 0;
}
时间: 2024-09-26 04:53:41

HDU1421的相关文章

hdu1421(dp)

搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 17130    Accepted Submission(s): 5805 Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是

搬寝室(HDU1421)

Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太多了,于是xhd决定随便搬2*k件过去就行了.但还是会很累,因为2*k也不小是一个不大于n的整数.幸运的是xhd根据多年的搬东西的经验发现每搬一次的疲劳度是和左右手的物品的重量差的平方成正比(这里补充一句,xhd每次搬两件东西,左手一件右手一件).例如xhd左

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

hdu1421 搬寝室(dp)

/* 先对n中物品的重量排序 令dp[i][j]表示前i个物品中选j对的最小疲劳度. 则dp[i][j]可能含有第i个物品(这种情况下,第i种物品一定是和第i-1个物品配对), 则dp[i][j]=dp[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1]) dp[i][j]的j对也可能不含有第i个物品,此时有 dp[i][j]=dp[i-1][j] 状态转移方程 dp[i][j]=min{dp[i-2][j-1]+(val[i]-val[i-1])*(val

HDU1421:搬寝室(线性dp)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1421 又是一道,没有思想的题,看了题解,我发现我的dp题几乎都看了题解,我总是想不好状态转移方程,汗颜,以后怎么比赛啊. 先排序,然后说一个数学问题. 首先,要怎么搬呢?即每一对要怎么取?如果有abcd四个数,且a<b<c<d,应该是取ab,cd好呢还是ac,bd好?抑或是bc,ad好呢?答案是第一种,因为: (a-b)^2+(c-d)^2 < (a-c)^2+(b-d)^2 (a-b)^

POJ--2676&amp;HDU--1421(数独,dfs)

Sudoku Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure. In some of

Dp Hdu1421 搬寝室

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1421 对每相邻的一对取或者不取 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include <cstdio> #include <cstdlib> #include <cstring> #incl

hdu1421——搬寝室

搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18400    Accepted Submission(s): 6227 Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n

搬寝室(hdu-1421)

这道题的dp数组含义还是很不好想的,一开始我根据状态量来枚举,要枚举三重循环,必然超时.后来参考别人的做法dp[i][j]表示在i件物品中选j对所需的最小疲劳值,相信几乎所有题解都是这么写的,你们也看烦了,那我就说说是什么意思吧 :由于这些东西的重量可以打乱,那我们不妨排序,则肯定拿相邻的两件最好,但是到底拿拿两件呢?(一件物品可以有两个邻居) ,所以在拿当前这一对时就发生了决策,可以选择不拿这一对,那么现在的最优解和i-1时的最优解一样,或者拿这一对,那么就是在dp[i-1][j-2]的基础上