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件物品这一对产生的疲劳度。
于是排序后依次考虑第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; }
相关文章推荐
- SQL处理代码的顺序
- java格式显示及类型转换
- 苹果又推新iPod Touch 看值不值得买
- vim列块操作
- Spring学习笔记1——基础知识
- HTTPS与SSL
- Windows下mysql忘记root密码破解
- 自学基础_linux_5_环境变量配置
- 简单分析Swift语言的一些基本特征
- 将字符串从文件中读取出来
- POJ 2888 Magic Bracelet 有限制的Polya计数
- Core Image 和视频
- 点击空白处隐藏软键盘
- update fedora 20-21/22
- Eclipse 发布到网站的附加产品的形式 Update Site
- android network develop(3)----Xml Parser
- windows shell备忘
- rotate array 旋转数组
- 下拉列表联动总结(AJAX下拉列表联动简单示例)
- su: warning: cannot change directory to /home/mongodb: Permission denied