zoukankan      html  css  js  c++  java
  • 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
    ", f[n][k]);
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    noi 1944 吃糖果
    noi 6049 买书
    noi 2985 数字组合
    noi 2728 摘花生
    noi 2718 移动路线
    noi 4977 怪盗基德的滑翔翼
    noi 8780 拦截导弹
    noi 1996 登山
    NOI 动态规划题集
    图的色数
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4650548.html
Copyright © 2011-2022 走看看