Dragon Ball

Problem Description
 
Sean has got a Treasure map which shows when and where the dragon balls will appear. some dragon balls will appear in a line at the same time for each period.Since the time you got one of them,the other dragon ball will disappear so he can only and must get one Dragon ball in each period.Digging out one ball he will lose some energy.Sean will lose |x-y| energy when he move from x to y.Suppose Sean has enough time to get any drogan ball he want in each period.We want to know the minimum energy sean will lose to get all period’s dragon ball.
 
Input
 
In the first line a number T indicate the number of test cases.Then for each case the first line contain 3 numbers m,n,x(1<=m<=50,1<=n<=1000),indicate m period Dragon ball will appear,n dragon balls for every period, x is the initial location of sean.Then two m*n matrix. For the first matrix,the number in I row and J column indicate the location of J-th Dragon ball in I th period.For the second matrix the number in I row and J column indicate the energy sean will lose for J-th Dragon ball in I-th period.
 
Output
 
For each case print a number means the minimum energy sean will lose.
 
Sample Input
 
1 3 2 5 2 3 4 1 1 3 1 1 1 3 4 2
 
Sample Output
 
8
 

题意:

  给你m天,每天在任意的一位坐标轴上出现n个球pos[i][j],0时间的时候在x位置,

  从x走向y花费abs(x-y)的价值,拿掉这个球花费cost[i][j]

  问你每次时间你都必须走向一个球拿掉它,m天后 最小花费是多少

题解:

  设定dp[i][j]表示第i天后在第j个球的最小花费,

  容易想到这是一个n*m*n的转移

  给了1.5s,值得一试

  不过你把转移方程写出来:

      对于从当前位置左边转移过来的 dp[i][j] = dp[i-1][k] - pos[i-1][k] + pos[i][j] + cost[i][j];

    对于从当前位置右边转移过来的  dp[i][j] = dp[i-1][k] + pos[i-1][k]  -pos[i][j] + cos[i][j];

  其中dp[i-1][k],pos[i-1][k];都是上一层的,这个我们预处理出就好了啊

  即使 dp[i-1][k] - pos[i-1][k] 维护最小  dp[i-1][k] + pos[i-1][k]维护最小,再二分取两者最小就可以了

  求个前缀的事。。。。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 1e3+, M = 1e4, mod = ,inf = 1e9;
typedef long long ll; int dp[][N],cost[][N],pos[][N],n,m,x,allpos[N],l[N],r[N];
pair<int,int > P[N];
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d%d%d",&m,&n,&x);
for(int i=;i<=m;i++)
for(int j=;j<=n;j++) scanf("%d",&pos[i][j]);
for(int i=;i<=m;i++)
for(int j=;j<=n;j++) scanf("%d",&cost[i][j]); for(int i=;i<=n;i++) dp[][i] = abs(x-pos[][i])+cost[][i]; for(int j=;j<=n;j++)
P[j] = make_pair(pos[][j],dp[][j] - pos[][j]);
sort(P+,P+n+);
for(int j=;j<=n;j++) allpos[j] = P[j].first; l[] = inf;
r[n+] = inf;
for(int j=;j<=n;j++)
l[j] = min(l[j-],P[j].second);
for(int j=;j<=n;j++)
P[j] = make_pair(pos[][j],dp[][j] + pos[][j]);
sort(P+,P+n+);
for(int j=n;j>=;j--)
r[j] = min(r[j+],P[j].second); for(int i=;i<=m;i++) { for(int j=;j<=n;j++) {
int tmp = upper_bound(allpos+,allpos+n+,pos[i][j])- allpos - ;
dp[i][j] = min(l[tmp] + cost[i][j]+pos[i][j],r[tmp+] + cost[i][j] - pos[i][j]);
// cout<<dp[i][j]<<" ";
}
for(int j=;j<=n;j++)
P[j] = make_pair(pos[i][j],dp[i][j] - pos[i][j]);
sort(P+,P+n+);
for(int j=;j<=n;j++) allpos[j] = P[j].first;
l[] = inf;
r[n+] = inf;
for(int j=;j<=n;j++)
l[j] = min(l[j-],P[j].second);
for(int j=;j<=n;j++)
P[j] = make_pair(pos[i][j],dp[i][j] + pos[i][j]);
sort(P+,P+n+);
for(int j=n;j>=;j--)
r[j] = min(r[j+],P[j].second);
// cout<<endl;
}
int ans = inf;
for(int i=;i<=n;i++) ans = min(dp[m][i],ans);
printf("%d\n",ans);
}
return ;
}

HDU 4362 Dragon Ball 贪心DP的更多相关文章

  1. HDU 4362 Dragon Ball 线段树

    #include <cstdio> #include <cstring> #include <cmath> #include <queue> #incl ...

  2. HDU 5903 Square Distance (贪心+DP)

    题意:一个字符串被称为square当且仅当它可以由两个相同的串连接而成. 例如, "abab", "aa"是square, 而"aaa", ...

  3. HDU 1051 Wooden Sticks 贪心||DP

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  4. hdu 1257 最少拦截系统【贪心 || DP——LIS】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  5. hdu 3635 Dragon Balls (带权并查集)

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. hdu 3635 Dragon Balls(并查集应用)

    Problem Description Five hundred years later, the number of dragon balls will increase unexpectedly, ...

  7. HDU 3635 Dragon Balls(超级经典的带权并查集!!!新手入门)

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  8. 【BZOJ-3174】拯救小矮人 贪心 + DP

    3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 686  Solved: 357[Submit][Status ...

  9. hdu 3635 Dragon Balls(并查集)

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

随机推荐

  1. Nonove js timer 计时器

    <html> <head> <title> Nonove js timer 计时器 </title> </head> <body> ...

  2. C#设计模式-1、适配器模式(Adapter Pattern)(转载)

    概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的.那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同 ...

  3. git入门知识了解

    文章转自:http://www.cnblogs.com/cocowool/archive/2012/02/17/2356125.html 源代码管理系统(SCM)与版本控制   版本控制是一种记录若干 ...

  4. phpcms下载下来的程序刚安装就报错了

    你服务器设置的索引等级 index.php比index.html的等级高.你输入地址 http://你的域名/index.html试试. ( ! ) Warning: array_keys() exp ...

  5. Android--UI之EditText

    前言 上一篇博客介绍了Android的TextView控件,这篇博客来说一下EditText控件.EditText为一个文本控件,提供了文本输入的功能,而且继承自TextView,可以理解为可以输入的 ...

  6. JAVA-- M选N的组合算法

      M选N的组合算法 只要每个数字出现一次就可以   举例 :也就是说123与321和213属于重复 只算一组  此算法已经排除了重复数据  应用--彩票的注数算法 本程序的思路是开一个数组b,其长度 ...

  7. DCMTK354之VC++ 2008 MFC应用程序配置完整过程

    花了一个礼拜,终于在VC++2008 MFC 应用程序中完成了首个基于DCMTK354的首个程序ECHOSCUWIN32,现将过程记录下来,便于日后查阅,同时也提供给那些有幸看到此博文而对他们又有帮助 ...

  8. 自动化运维之puppet的学习(如何找到你需要的模块)

    https://forge.puppetlabs.com/  puppet 模块下载 http://kisspuppet.com/2014/01/14/puppet_forge_modules/ pu ...

  9. scrapy和selenium结合抓取动态网页

    1.安装python (我用的是2.7版本的) 2.安装scrapy:   详情请参考 http://blog.csdn.net/wukaibo1986/article/details/8167590 ...

  10. 【Python】Django 支持 restful 风格 url

    URL通配符示例: url(r'^file_download/(?P<filename>(.)*)$', views.FILE_DOWNLOAD_VIEW.as_view()), 代码示例 ...