HDU 4362 Dragon Ball 贪心DP

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+20, M = 1e4, mod = 1000000007,inf = 1e9;
typedef long long ll;

int dp[55][N],cost[55][N],pos[55][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=1;i<=m;i++)
            for(int j=1;j<=n;j++) scanf("%d",&pos[i][j]);
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++) scanf("%d",&cost[i][j]);

        for(int i=1;i<=n;i++) dp[1][i] = abs(x-pos[1][i])+cost[1][i];

        for(int j=1;j<=n;j++)
                P[j] = make_pair(pos[1][j],dp[1][j] - pos[1][j]);
            sort(P+1,P+n+1);
            for(int j=1;j<=n;j++) allpos[j] = P[j].first;

            l[0] = inf;
            r[n+1] = inf;
            for(int j=1;j<=n;j++)
                l[j] = min(l[j-1],P[j].second);
            for(int j=1;j<=n;j++)
                P[j] = make_pair(pos[1][j],dp[1][j] + pos[1][j]);
            sort(P+1,P+n+1);
            for(int j=n;j>=1;j--)
                r[j] = min(r[j+1],P[j].second);

        for(int i=2;i<=m;i++) {

            for(int j=1;j<=n;j++) {
                int tmp = upper_bound(allpos+1,allpos+n+1,pos[i][j])- allpos - 1;
                dp[i][j] = min(l[tmp] + cost[i][j]+pos[i][j],r[tmp+1] + cost[i][j] - pos[i][j]);
              //  cout<<dp[i][j]<<" ";
            }
            for(int j=1;j<=n;j++)
                P[j] = make_pair(pos[i][j],dp[i][j] - pos[i][j]);
            sort(P+1,P+n+1);
            for(int j=1;j<=n;j++) allpos[j] = P[j].first;
            l[0] = inf;
            r[n+1] = inf;
            for(int j=1;j<=n;j++)
                l[j] = min(l[j-1],P[j].second);
            for(int j=1;j<=n;j++)
                P[j] = make_pair(pos[i][j],dp[i][j] + pos[i][j]);
            sort(P+1,P+n+1);
            for(int j=n;j>=1;j--)
                r[j] = min(r[j+1],P[j].second);
               // cout<<endl;
        }
        int ans = inf;
        for(int i=1;i<=n;i++) ans = min(dp[m][i],ans);
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-12-09 18:31:01

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

hdu 4362 Dragon Ball

Dragon Ball                                                           Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2204    Accepted Submission(s): 770 Problem Description Sean has got a Trea

HDU 4362 Dragon Ball(维护最小值DP优化)

 题意: 在连续的 n 秒中,每秒会出现 m 个龙珠,出现之后会立即消失,知道了第一秒所在的位置,每从一个位置移动到另一个位置的时候,消耗的价值为 abs(i-j), 知道了次出现的龙珠的价值,问 n 秒之后得到的最大价值是多少. 思路:这道题朴素的做法时间复杂度为O(n*n*m)勉强可以水过去,正解应该是用单调队列的思路维护最小值优化. 由状态转移方程dp[i][j] = min{ dp[i-1][k] + abs(pos[i-1][k]-pos[i][j]) } + cost[i][j]

HDU 4362 Dragon Ball 线段树

#include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <map> #include <set> #include <stack> #include <vector> #include <iostream> #include <algorithm> using namespace st

HDU 5903 Square Distance (贪心+DP)

题意:一个字符串被称为square当且仅当它可以由两个相同的串连接而成. 例如, "abab", "aa"是square, 而"aaa", "abba"不是. 两个长度相同字符串之间的 hamming distance是对应位置上字符不同的位数. 给定一行字符串和 m,输出字典序最小的字符串. 析:首先先用dp判断能不能形成这样的字符串,然后再打印出来,dp[i][j] 表示 i - 中间的数能不能改 j 个字符得到,最后打印

HDU 1051 Wooden Sticks 贪心||DP

Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 22000    Accepted Submission(s): 8851 Problem Description There is a pile of n wooden sticks. The length and weight of each stick ar

HDU 4811 Ball(贪心)

2014-05-15 22:02 by Jeff Li 前言 系列文章:[传送门] 马上快要期末考试了,为了学点什么.就准备这系列的博客,记录复习的成果. 正文-计数  概率 概率论研究随机事件.它源于赌徒的研究.即使是今天,概率论也常用于赌博.随机事件的结果是否只凭运气呢?高明的赌徒发现了赌博中的规律.尽管我无法预知事件的具体结果,但我可以了解每种结果出现的可能性.这是概率论的核心. "概率"到底是什么?这在数学上还有争议."频率派"认为概率是重复尝试多次,某种结

HDU 4939 Stupid Tower Defense(贪心+dp)

HDU Stupid Tower Defense 题目链接 题意:有一些塔,红塔能攻击经过他的,绿塔能攻击经过之后的,蓝塔能把经过之后的减速,求在1-n上放塔,求伤害最大值 思路:一开始以为直接贪心,绿塔最前,蓝塔中间,红塔最后就可以了,结果其实是错的 不过,红塔放最后是肯定的,这个很显然就不多证明了,是贪心的思想 然后就dp[i][j]表示放到i,前面有j个绿塔去状态转移即可 代码: #include <cstdio> #include <cstring> #include &l

HDU 4939 Stupid Tower Defense(dp+贪心)

dp[i][j]表示到了第i步放了j个减速,造成的伤害.我们用贪心的策略把造成一段伤害的放在最后面,造成持续伤害的与减速放在前i个中这样得到的伤害是最高的. 所以前(i,j)中的伤害为dp[i][j] = max(dp[i-1][j]+(j*z+t)*(max(0LL, i-1-j))*y, dp[i-1][j-1]+((j-1)*z+t)*(i-j)*y); 每次造成的伤害就为:dp[i][j]+(n-i)*(j*z+t)*(x+(i-j)*y).然后取一个最大值,就是伤害的最大值了. Stu

HDU 3635 Dragon Balls(并查集)

Dragon Balls Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 64   Accepted Submission(s) : 26 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Five hundred years later