hdu 1421 搬寝室,dp
来源:互联网 发布:淘宝兼职按照月结 编辑:程序博客网 时间:2024/05/05 12:44
题意:
在n个物品里面选取k对物品,使这k对物品的平方差之和最小。
分析:
一道典型的dp题目。
dp[i][j]表示的是在前i个物品里面选取j对的品方差之和,其中i大于等于j*2
我们对,物品排序之和会发现,由于是平方差之和,那么一个数字一般只会和他前面的一个数字或者后面的数字组合。
这样我们来想递推方程的时候会简单很多的。
dp[i][j] 有两种方式可以得到,一种是这j对物品中包括第i个物品,一种是不包括,包括i的话,那么i物品一定会和i-1物品配对,然后加上在前i-2个物品中选取j-1对,
这时就是dp[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1]);
不包括i的话,那么就直接是dp[i-1][j],选取两者中的较小值就可以了的。
但我们应该注意到,若i是偶数并且j*2正好等于i的话,那么就没有dp[i-1][j],这时候直接等于dp[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1])。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>using namespace std;#define size 2005int dp[size][1005];int val[size] ;int main(){int n,k;while (scanf("%d%d",&n,&k)!=EOF){val[0] = 0;for(int i = 1 ; i <= n ; i++) { scanf("%d",&val[i]); }sort(val+1,val+n+1);memset(dp,0,sizeof(dp));for (int i = 2 ; i <= n ; i++){for (int j = 1 ; j*2 <= i ; j++) { if(j*2==i) dp[i][j] = dp[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1]); else dp[i][j] = min(dp[i-1][j],dp[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1])); //dp[i][j] = min(dp[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1]),dp[i-1][j]); }}printf("%d\n",dp[n][k]);}return 0;}
0 0
- hdu 1421 搬寝室 (DP)
- Hdu 1421 搬寝室 dp
- hdu 1421 搬寝室(DP)
- hdu 1421 搬寝室 dp
- HDU-1421 搬寝室-dp
- HDU 1421搬寝室 DP
- HDU 1421 搬寝室 DP
- hdu 1421 搬寝室(dp)
- HDU-1421-搬寝室(DP)
- HDU 1421 搬寝室(dp)
- HDU 1421 搬寝室(DP)
- 搬寝室 -HDU 1421 dp
- HDU 1421 搬寝室(DP)
- hdu 1421 搬寝室 dp
- HDU 1421 搬寝室[DP]
- hdu 1421 搬寝室 DP
- HDU 1421 搬寝室 (DP)
- HDU 1421--搬寝室【DP】
- 系统的动态性能比较_20160213
- PHP之数据分组
- c语言实现去除代码中的注释
- Spring事务配置的五种方式
- Orchard基本概念快速理解
- hdu 1421 搬寝室,dp
- ubuntu中redmine局域网内发送邮件提示redmine getaddrinfo: Name or service not known
- Hive - hive.groupby.skewindata环境变量与负载均衡
- 数据结构基本八大排序算法
- sysbench 说明
- 在 GO 编程语言中处理 JSON 数据
- (九)建造者模式
- Kotlin初体验
- js.net 多语言&web service 添加服务引用和web 引用