题意:有一些男生女生,男生女生数量差不超过100 ,男生女生两两配对。要求求出一种配对方法,使每一对的高度差的和最小。

思路:(我是真的笨笨笨!!)设人少的一组人数为n,b[],人多的一组人数为m,g[](b[],g[]先排好序),用dp[i][j]表示n中的前i个人与m中的前j个人配对所得到的最小值。

对于每个i,j的范围是(i~i+m-n)

这样j的范围是i~m-n+i,对于dp数组而言,第二维数组要开到m,由于数组过大,而我们又知道,m-n<=100,所以用j表示j-i,j的范围就变成了(0~m-n),也就是(0~100),这种情况下dp[i][j]表示b中前i个人和g中前i+j个人的最小值。

对于每一个dp[i][j]它的可能就是选第i+j个,不选第i+j个数。

如果不选的话,那么dp[i][j]就等于dp[i][j-1],如果选了呢,就是dp[i-1][j]+|b[i]-g[i+j]|

状态转移方程:dp[i][j]=min(dp[i][j-1], dp[i-1][j] + |b[i]-g[i+j]|)

AC代码:

/** hdu 3392 */

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std; const int N = 10005;
double a[N], b[N];
double dp[N][110]; double getdp(int m, int n, double *g, double *b)
//m,g为人数多的一组,n,b为人少的一组
{
for (int i = 1; i <= n; ++i) {
dp[i][0] = dp[i - 1][0] + fabs(b[i] - g[i]);//对于dp[...][0],即两组个数相等,没有选择~
for (int j = 1; j <= m - n; ++j) {
dp[i][j] = min(dp[i - 1][j] + fabs(b[i] - g[i + j]), dp[i][j - 1]);
}
}
return dp[n][m - n];
} int main()
{
//freopen("in.txt", "r", stdin);
int boys, girls;
while (scanf("%d%d", &boys, &girls) != EOF && (boys || girls)) {
for (int i = 1; i <= boys; i++) {
scanf("%lf", &a[i]);
}
for (int i = 1; i <= girls; i++) {
scanf("%lf", &b[i]);
}
sort(a + 1, a + 1 + boys);
sort(b + 1, b + 1 + girls);
double ans;
if (boys < girls)
ans = getdp(girls, boys, b, a);
else
ans = getdp(boys, girls, a, b);
printf("%f\n", ans);
}
return 0;
}

但是看了别人的博客,可以用到滚动数组【啊喂!!我就是为了学一下滚动数组才搜到这道题的,结果根本不用啊!】。

滚动数组很神奇啊,因为对于每一个dp[i],求它的过程只与dp[i-1]有关,所以开成2个就够了。既dp[2][...]

代码

/** hdu 3392 */

const int N = 10005;
double a[N], b[N];
double dp[2][110]; double getdp(int m, int n, double *g, double *b)
//m,g为人数多的一组,n,b为人少的一组
{
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; ++i) {
dp[i % 2][0] = dp[(i - 1) % 2][0] + fabs(b[i] - g[i]);
for (int j = 1; j <= m - n; ++j) {
dp[i % 2][j] = min(dp[(i - 1) % 2][j] + fabs(b[i] - g[i + j]), dp[i % 2][j - 1]);
}
}
return dp[n % 2][m - n];
}

改了之后注意加一句memset(dp, 0, sizeof(dp));

因为窝之前的dp[0][..]是没有用到的,一直是0……所以不用

对于这种通过%N...来节省数组空间的方法窝觉得真是太神奇了orz……

继续努力~

HDU 3392 Pie(DP)的更多相关文章

  1. hdu 3392(滚动数组优化dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3392 Pie Time Limit: 6000/3000 MS (Java/Others)    Me ...

  2. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  3. hdu 4507 数位dp(求和,求平方和)

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...

  4. hdu 3709 数字dp(小思)

    http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...

  5. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. hdu 4283 区间dp

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  7. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  8. HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

  9. HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)

    HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...

随机推荐

  1. redhat 5.4 下rabbitMQ单机安装.md

    1. 系统版本 `cat /etc/redhat-release` `Red Hat Enterprise Linux Server release 5.4 (Tikanga)`   2. 下载软件包 ...

  2. vs2013下使用Assist X的破解方法

    Assist X的破解下载:http://pan.baidu.com/s/1kTnDH23 密码:j9jp 01.安装,点击VA_X_Setup2042.exe 安装 02.破解 找到这样的目录:C: ...

  3. pgrep 查询进程的工具

    pgrep 1:简介 pgrep 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行.在服务器的配置和管理中,这个工具常被应用,简单明了: 1:用法 #pgrep 参数选项 程序名 常用 ...

  4. Docker 监控- Prometheus VS Cloud Insight

    如今,越来越多的公司开始使用 Docker 了,2 / 3 的公司在尝试了 Docker 后最终使用了它.为了能够更精确的分配每个容器能使用的资源,我们想要实时获取容器运行时使用资源的情况,怎样对 D ...

  5. Vector 的清空

    前两天比赛有一道题,有用到了vector的清空,用的是swap,我一开始还不太清楚,所以去查了下资料,转载一篇关于vector的清空的. vector <int> vecInt; ; i& ...

  6. JAVA客户端API调用memcached两种方式

    1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...

  7. UVALive - 3713 Astronauts

    给定n个宇航员的年龄,平均年龄为 ave,根据下列要求分配任务: B任务只能分配给年龄<ave的宇航员: A任务只能分配给年龄>=ave的宇航员: C任务可以任意分配. 给定m组互相憎恨的 ...

  8. JMP软件中的晶圆图( Wafer Map)分析

    关键词:芯片 良率分析 晶圆图 质量管理 JMP Minitab 半导体芯片的生产,简单来讲,是将电路通过各种复杂的物理化学方法制作到晶圆上,在生产的最后阶段会进行不同电性功能的测试以确保产品的功能性 ...

  9. Document字段发生变化后,报的错

    2016-10-11 15:27:47,828 [ERROR] [main] SpringApplication:838 - Application startup failedorg.springf ...

  10. 用APP赚钱(转)

    英文原文:MAKING MONEY ON APPS 做为半个 iOS 开发的一家公司,我时不时地考虑如何用 APP 赚钱.最近由Brent Simmons 和 Jared Sinclair 的文章挑起 ...