HDU 4540 威威猫系列故事——打地鼠 (DP)

威威猫系列故事——打地鼠

Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1642    Accepted Submission(s): 807

Problem Description

  威威猫最近不务正业,每天沉迷于游戏“打地鼠”。
  每当朋友们劝他别太着迷游戏,应该好好工作的时候,他总是说,我是威威猫,猫打老鼠就是我的工作!
  无话可说...
  
  我们知道,打地鼠是一款经典小游戏,规则很简单:每隔一个时间段就会从地下冒出一只或多只地鼠,玩游戏的人要做的就是打地鼠。

  假设:
  1、每一个时刻我们只能打一只地鼠,并且打完以后该时刻出现的所有地鼠都会立刻消失;
  2、老鼠出现的位置在一条直线上,如果上一个时刻我们在x1位置打地鼠,下一个时刻我们在x2位置打地鼠,那么,此时我们消耗的能量为abs( x1 - x2 );
  3、打第一只地鼠无能量消耗。

  现在,我们知道每个时刻所有冒出地面的地鼠位置,若在每个时刻都要打到一只地鼠,请计算最小需要消耗多少能量。

Input

输入数据包含多组测试用例;
每组数据的第一行是2个正整数N和K(1 <= N <= 20, 1 <= K <= 10 ),表示有N个时刻,每个时刻有K只地鼠冒出地面;
接下来的N行,每行表示一个时刻K只地鼠出现的坐标(坐标均为正整数,且<=500)。

Output

请计算并输出最小需要消耗的能量,每组数据输出一行。

Sample Input

2 2
1 10
4 9
3 5
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15

Sample Output

1
1

Source

2013腾讯编程马拉松复赛第三场(3月31日)

Recommend

liuyiding

DP水题,dp[i][j]代表打第i层第j个地鼠消耗的最小能量。

暴力枚举更新每一层消耗的能量。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int MAXN=20+5;
int num[MAXN][MAXN],dp[MAXN][MAXN];
int main()
{
    int n,k;
    while(scanf("%d %d",&n,&k)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        memset(num,0,sizeof(num));

        for(int i=0;i<n;i++)
            for(int j=0;j<k;j++)
                scanf("%d",&num[i][j]);

        for(int i=1;i<n;i++)
            for(int j=0;j<k;j++)
                for(int l=0;l<k;l++)
                {
                    if(l==0)
                        dp[i][j]=dp[i-1][l]+(abs(num[i-1][l]-num[i][j]));
                    else
                        dp[i][j]=min(dp[i-1][l]+abs(num[i-1][l]-num[i][j]),dp[i][j]);
                }

        int minn=0x3f3f3f3f;
        for(int i=0;i<k;i++)
            if(dp[n-1][i]<minn)
                minn=dp[n-1][i];

        printf("%d\n",minn);
    }
    return 0;
}

时间: 2024-10-28 16:42:46

HDU 4540 威威猫系列故事——打地鼠 (DP)的相关文章

HDU 4540 威威猫系列故事――打地鼠(DP)

D - 威威猫系列故事――打地鼠 Time Limit:100MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4540 Description 威威猫最近不务正业,每天沉迷于游戏“打地鼠”.  每当朋友们劝他别太着迷游戏,应该好好工作的时候,他总是说,我是威威猫,猫打老鼠就是我的工作!  无话可说...    我们知道,打地鼠是一款经典小游戏,规则很简单:每隔一个时间

HDOJ4540 威威猫系列故事——打地鼠 【DP】

威威猫系列故事--打地鼠 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1445    Accepted Submission(s): 713 Problem Description 威威猫最近不务正业,每天沉迷于游戏"打地鼠". 每当朋友们劝他别太着迷游戏,应该好好工作的时候,他总是说,我是威威猫,猫打老鼠就是我的工作! 无话

hdu 4540 威威猫系列故事——打地鼠

http://acm.hdu.edu.cn/showproblem.php?pid=4540 dp公式: dp[i][j]=min(dp[i][j],dp[i-1][c]+abs(a[i][j]-a[i-1][c])); dp[i][j] 表示:第i时刻第j个地鼠的最小能量. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define ll long long 5 #define m

HDU 4540 威威猫系列故事——打地鼠(简单DP)

解题思路: 水题,直接DP. #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <cmath> #include <vector> #include <queue> #include <stack> #include <set>

威威猫系列故事——打地鼠(HDU-4540)

影响决策的因素有:时刻.这一时刻的位置和上一时刻的位置 .  由于n和k都不大,可以开三重循环来递推这三个量 状态方程dp[i][j]表示在时刻i打位置j的老鼠,此时消耗总能量的最小值,则可以写出状态转移方程:dp[i][j] = min(dp[i][j],dp[i+1][x]+abs(a[i][j]-a[i+1][x])); 时间按照从大到小倒着枚举. #include<cstdio> #include<cstring> #include<iostream> #inc

HDU - 4526 威威猫系列故事――拼车记 (DP)

Description 话说威威猫有一次去参加比赛,虽然学校离比赛地点不太远,但威威猫还是想坐出租车去.大学城的出租车总是比较另类,有"拼车"一说,也就是说,你一个人坐车去,还是一堆人一起,总共需要支付的钱是一样的(每辆出租上除司机外最多坐下4个人).刚好那天同校的一群Acmer在校门口扎堆了,大家果断决定拼车去赛场. 问题来了,一辆又一辆的出租车经过,但里面要么坐满了乘客,要么只剩下一两个座位,众Acmer都觉得坐上去太亏了,威威猫也是这么想的. 假设N名Acmer准备拼车,此时为0

hdu4533 威威猫系列故事——晒被子

Problem Description 因为马拉松初赛中吃鸡腿的题目让不少人抱憾而归,威威猫一直觉得愧对大家,这几天他悄悄搬到直角坐标系里去住了. 生活还要继续,太阳也照常升起,今天,威威猫在第一象限晒了N条矩形的被子,被子的每条边都和坐标轴平行,不同被子的某些部分可能会叠在一起.这时候,在原点处突然发了场洪水,时间t的时候,洪水会蔓延到( t, t ),即左下角为( 0, 0 ) ,右上角为( t, t )的矩形内都有水. 悲剧的威威猫想知道,在时间t1, t2, t3 ... tx 的时候,

HDU 4513 哥几个系列故事——形成完善II manacher求最长回文

标题来源:哥几个系列故事--形成完善II 意甲冠军:中国 思维:在manacher断 保证非严格递减即可了 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 100110; int a[maxn<<1]; int b[maxn<<1]; int dp[maxn<<1]; int manacher

HDU 4504 威威猫系列故事——篮球梦(dp)

http://acm.hdu.edu.cn/showproblem.php?pid=4504 题目大意: 中文都看得懂.不过我是看hint才正确理解什么意思的.开始的时候理解错了. 解题思路: 给定时间最多是600,最多进攻次数600/15=40次,我方进攻次数40/2=20次.如果深度搜索多少种情况, 那么时间复杂度是O(3^20),直接就超时了. 我知道要动态规划,但是自己dp不行,所以就看了网上别人的解题报告. dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+dp[i