hdu 1421 经典dp

很显然,将物品按照重量排序后,如果要搬某一对物品,则这两件物品一定是相邻的。

于是排序后依次考虑第i件物品放或者不放,即得到状态转移方程:

  f[i][j] = min( f( i - 1, j ), f( i - 2, j - 1 ) + d[i] );

其中,d[i]表示第i件物品和第i-1件物品这一对产生的疲劳度。

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5
 6 const int N = 2001;
 7 const int M = 1001;
 8 int f[N][M];
 9 int c[N];
10 int n, k;
11
12 int F( int i, int j )
13 {
14     if ( j * 2 > i ) return 999999999;
15     if ( i == 0 || i == 1 ) return 0;
16     return f[i][j];
17 }
18
19 int main ()
20 {
21     while ( scanf("%d%d", &n, &k) != EOF )
22     {
23         for ( int i = 1; i <= n; i++ )
24         {
25             scanf("%d", c + i);
26         }
27         sort( c + 1, c + 1 + n );
28         for ( int i = 2; i <= n; i++ )
29         {
30             for ( int j = i / 2; j > 0; j-- )
31             {
32                 int d = ( c[i] - c[i - 1] ) * ( c[i] - c[i - 1] );
33                 f[i][j] = min( F( i - 1, j ), F( i - 2, j - 1 ) + d );
34             }
35         }
36         printf("%d\n", f[n][k]);
37     }
38     return 0;
39 }
时间: 2024-11-14 11:49:59

hdu 1421 经典dp的相关文章

hdu 1227(经典dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1227 Fast Food Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2165    Accepted Submission(s): 926 Problem Description The fastfood chain McBurger

HDU 1176 经典dp

记录最晚时间 从time为2枚举到最晚时间 每个时间段的x轴节点都等于上一个时间段的可触及的最大馅饼数 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> using namespace std; int dp[100050][11]; int a[100050][11]; void init() { memset(a,0,

hdu 1159 经典dp最长公共子序列

背景:上次比赛就没有做出来,回来根据实际意义半天也想不出如何dp,结果从猜转移方程入手,竟然想对了!开始想把空间优化到一维数组,没有想到要用同维度左边的值wa了. 思路: dp[i][j]=max{max[i-1][j],max[i][j-1],max[i-1][j-1]+(a[i] == b[j])} //dp[i][j]定以为,a串的前i个字符和b串的前b个字符的最大字串和,为选a串的第i个字符而不选b串的第j个字符,不选a串的第i个字符而选b串的第j个字符,既选a串的第i个字符又选b串的第

hdu 1421 简单dp

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <cmath> #include <cstring> #include <stack> #include <set> #include <map> #include <vector> using namespace st

hdu 1421 搬寝室 (dp)

思路分析: dp[i][j] 表示选取到第 i 个   组成了 j 对的最优答案. 当然排序之后 选取相邻两个是更优的. if(i==j*2) dp[i][j] = dp[i-2][j-1] + w[i]-w[i-2]^2.. else if( i> j*2 ) dp[i][j] = min (dp[i-2][j-1] + ...^2   ,    dp[i-1][j]).... #include <cstdio> #include <iostream> #include &

I DP Hdu 1421

<span style="color:#3333ff;">/* ______________________________________________________________________________________________________ author : Grant Yuan time : 2014.7.19 algorithm : dp explain : 首先对所有的物体按照重量的从小到大进行一次排序,第i件物体只能和第i-1件物体配对;

DP问题(2) : hdu 1421

题目转自hdu 1421,题目传送门 题目大意: 给你n个物品,你要搬走2*k个(也就是搬k次) 每次搬需要花费v,v=(ai-aj)2 (i表示左手拿的物品重量,j表示右手拿的物品的重量) 要求所有v相加得数最少 不难看出,这就像是01背包 这道题很水但我还是调了0.25h 感谢wsy大佬的帮助 emmm...... 首先,这肯定是一个n*k的dp 其中,i表示有i个物品,j表示需要搬j回 那么我们可以得出它的转移方程: dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]

hdu 1421 搬寝室

http://acm.hdu.edu.cn/showproblem.php?pid=1421 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 int dp[2011][2001]; 7 int a[2011]; 8 int n,k; 9 10 int sqr(int x) 11 { 12 return x*x; 13 } 14 15 bo

hdu 2151 Worm (DP)

Worm Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2637    Accepted Submission(s): 1707 Problem Description 自从见识了平安夜苹果的涨价后,Lele就在他家门口水平种了一排苹果树,共有N棵.突然Lele发现在左起第P棵树上(从1开始计数)有一条毛毛虫.为了看到毛毛虫变蝴蝶的过程