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