http://acm.hdu.edu.cn/showproblem.php?pid=1421

【题意】

  • 给定n个数,要从n个数中选择k个二元组{x,y},最小化sum{(x-y)^2}
  • 2<=2*k<=n<2000

【思路】

  • 首先排序,一定选择相邻的两项作为一对
  • dp[i][j]表示选择到ai,组成j对时的最小值
  • 两种选择:第j对中有ai,dp[i][j]由dp[i-2][j-1]转移来
  • 第j对中没有ai,dp[i][j]由dp[i-1][j]转移来
  • 注意初始化

【AC】

 #include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue> using namespace std;
typedef long long ll;
const int maxn=2e3+;
const ll inf=;
ll a[maxn];
ll dp[maxn][maxn/];
int n,k;
int main()
{
while(~scanf("%d%d",&n,&k))
{
for(int i=;i<=n;i++)
{
for(int j=;j<=k;j++)
{
dp[i][j]=inf;
}
}
for(int i=;i<=n;i++)
{
dp[i][]=;
}
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
}
sort(a+,a++n);
for(int i=;i<=n;i++)
{
for(int j=;j<=k;j++)
{
ll tmp=(a[i]-a[i-])*(a[i]-a[i-]);
dp[i][j]=min(dp[i][j],dp[i-][j]);
dp[i][j]=min(dp[i][j],dp[i-][j-]+tmp);
}
} ll ans=inf;
for(int i=;i<=n;i++)
{
ans=min(ans,dp[i][k]);
}
cout<<ans<<endl;
}
return ;
}

dp

最新文章

  1. MongoDB初学
  2. Oracle EBS R12 (12.1.3) Installation Linux(64 bit)
  3. 2016年12月30日 星期五 --出埃及记 Exodus 21:25
  4. yii2-按需加载并管理CSS样式/JS脚本
  5. faster alter table add column
  6. Python os模块常用部分功能
  7. 一、Oracle分析函数入门
  8. NET基础课--NET中程序集0-1
  9. iOS:获取图片Alpha图片
  10. jquery easyui Accordion的使用
  11. 读Zepto源码之Callbacks模块
  12. ●BZOJ 2669 [cqoi2012]局部极小值
  13. 我眼中的 Nginx(四):是什么让你的 Nginx 服务退出这么慢?
  14. ES6的 let const 以及块级作用域
  15. zookeeper部署
  16. 获取APP的元素信息和Activity
  17. 【Java-JPA】让Springboot启动不检查JPA的数据源配置
  18. day13 for内部机制详解,迭代器
  19. Python3 实现 JS 中 RSA 加密的 NoPadding 模式
  20. LinkedHashMap 实现总结

热门文章

  1. RedHat改yum源免费使用CentOS源
  2. AJPFX简述Object类
  3. AJPFX谈Java 性能优化之基本类型 vs 引用类型
  4. 通过流传入excel解析的问题
  5. re正则表达式2
  6. poj1190 生日蛋糕
  7. EJB2的配置
  8. COGS 942. [東方S3] 比那名居天子
  9. 职业生涯手记——记人生中第一次经历的产品上线——内测篇Day11
  10. (转)用@Resource注解完成属性装配