您的位置:首页 > 其它

hdu 1421 经典dp

2015-07-16 10:46 274 查看
很显然,将物品按照重量排序后,如果要搬某一对物品,则这两件物品一定是相邻的。

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

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

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

#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

const int N = 2001;
const int M = 1001;
int f
[M];
int c
;
int n, k;

int F( int i, int j )
{
if ( j * 2 > i ) return 999999999;
if ( i == 0 || i == 1 ) return 0;
return f[i][j];
}

int main ()
{
while ( scanf("%d%d", &n, &k) != EOF )
{
for ( int i = 1; i <= n; i++ )
{
scanf("%d", c + i);
}
sort( c + 1, c + 1 + n );
for ( int i = 2; i <= n; i++ )
{
for ( int j = i / 2; j > 0; j-- )
{
int d = ( c[i] - c[i - 1] ) * ( c[i] - c[i - 1] );
f[i][j] = min( F( i - 1, j ), F( i - 2, j - 1 ) + d );
}
}
printf("%d\n", f
[k]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: