HDU 4362 Dragon Ball 贪心DP
Dragon Ball
题意:
给你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的更多相关文章
- HDU 4362 Dragon Ball 线段树
#include <cstdio> #include <cstring> #include <cmath> #include <queue> #incl ...
- HDU 5903 Square Distance (贪心+DP)
题意:一个字符串被称为square当且仅当它可以由两个相同的串连接而成. 例如, "abab", "aa"是square, 而"aaa", ...
- HDU 1051 Wooden Sticks 贪心||DP
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 1257 最少拦截系统【贪心 || DP——LIS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- hdu 3635 Dragon Balls (带权并查集)
Dragon Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 3635 Dragon Balls(并查集应用)
Problem Description Five hundred years later, the number of dragon balls will increase unexpectedly, ...
- HDU 3635 Dragon Balls(超级经典的带权并查集!!!新手入门)
Dragon Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- 【BZOJ-3174】拯救小矮人 贪心 + DP
3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 686 Solved: 357[Submit][Status ...
- hdu 3635 Dragon Balls(并查集)
Dragon Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
随机推荐
- javafx实现饼图统计效果图
- [整] JavaScript m选n组合算法
01转换法: 思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中. 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数. 然后从左到右扫描数组元素值 ...
- dedecms首页调用的简介一直修改不了是自动文章摘要在作怪
一位美女问:dedecms首页调用的简介一直修改不了,ytkah让她到具体的文章修改,然后再重新生成一下首页.她说还是不行.那就奇了怪了,点击到具体的文章页面是显示已经修改好了,为什么首页还是原来的呢 ...
- [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法
js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...
- [Effective JavaScript 笔记]第33条:使构造函数与new操作符无关
当使用函数作为一个构造函数时,程序依赖于调用者是否记得使用new操作符来调用该构造函数.注意:该函数假设接收者是一个全新的对象. 一个例子 function User(name,pwd){ this. ...
- 开机提示grub可咋办啊
导读 GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统.GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数. 1 ...
- C++中的memset()函数 ------------转自:http://www.360doc.com/content/10/1006/18/1704901_58866679.shtml
memset()函数可以对大内存的分配进行很方便的操作(初始化),所谓“初始化”,当然是指将你定义的变量或申请的空间赋予你所期望的值,例如语句int i=0;就表明定义了一个变量i,并初始化为0:如果 ...
- Windows/Centos安装GO语言环境
转载:http://www.haiyun.me/archives/1009.html Centos下使用epel源安装: 1 yum install golang Centos/Linux下源码安装g ...
- POJ 1251 Jungle Roads (prim)
D - Jungle Roads Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Su ...
- 九度 OJ1008 hdu 3790
#include<stdio.h> #include<string.h> struct node { int d; int p; }g[][]; #define inf 0x3 ...