Hunter (HDU - 4568,SPFA + 状压 DP)

CodeForces - 807A Is it rated? +807B T-Shirt Hunt +807C Success Rate 1.Is it rated? CodeForces - 807A 给定n位选手两场比赛的前后分数,判断情况属于“rated”,“unrated”,“maybe“这三种的哪种。 ”rated“:至少一名选手的前后分数改变; ”unrated“:当后一名选手的分数大于前一名的分数; ”maybe“:其他情况。 #include<cstdio> #include<cma... 阅读详情

一.题目链接:

HDU-4568

二.题目大意:

给一个 n*m 的地图,每个点上有一个数代表花费,-1代表无法经过,有 k 个关键点.

求从地图的任意一侧进入,遍历完所有的关键点,离开地图的最小花费.

三.分析:

设地图外为 0 号关键点,对 k + 1 个关键点分别跑 spfa,得到两两关键点的花费,之后状压即可.

关于状压状态设计,我们选取的是 dp[i][j] 代表点状态为 i,当前在 j 点.

之前把状态设计反,wa 了两晚上....

四.代码实现:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)2e2;
const int N = (int)14;
const int inf = 0x3f3f3f3f;
const ll mod = (ll)1e9 + 7;

int n, m, k;
int a[M + 5][M + 5];
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};

int cnt;
int head[M * M + 5];
struct node
{
    int v, nx, w;
}Edge[M * M * 4 + M * 8 + 5];

int x[N], y[N];

int cost[N][N];
int dp[1<<N][N];

void init(int n)
{
    cnt = 0;
    for(int i = 0; i <= n; ++i)
    {
        head[i] = -1;
    }
}

void add(int u, int v, int w)
{
    Edge[cnt].v = v;
    Edge[cnt].w = w;
    Edge[cnt].nx = head[u];
    head[u] = cnt++;
}

int id(int i, int j)
{
    return i * m + j + 1;
}

struct Graph
{
    int dis[M * M + 5];
    bool vis[M * M + 5];
    queue <int> q;

    void spfa(int s, int n)
    {
        for(int i = 0; i <= n; ++i) dis[i] = inf, vis[i] = 0;
        q.push(s);
        vis[s] = 1, dis[s] = 0;
        while(!q.empty())
        {
            int u = q.front(); q.pop();
            vis[u] = 0;
            for(int i = head[u]; ~i; i = Edge[i].nx)
            {
                int v = Edge[i].v;
                if(dis[v] > dis[u] + Edge[i].w)
                {
                    dis[v] = dis[u] + Edge[i].w;
                    if(!vis[v])
                    {
                        vis[v] = 1;
                        q.push(v);
                    }
                }
            }
        }
    }
}G[N];

/**
1
2 4
1 3 8 7
1 10 7 6
5
0 0
0 3
0 1
1 2
1 0
**/

int main()
{
    int T; scanf("%d", &T);
    while(T--)
    {
        scanf("%d %d", &n, &m);
        init(n * m);
        for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j) scanf("%d", &a[i][j]);
        for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j)
        {
            if(a[i][j] == -1)   continue;
            for(int k = 0; k < 4; ++k)
            {
                int x = i + dx[k], y = j + dy[k];
                if(x >= 0 && x < n && y >= 0 && y < m && ~a[x][y])    add(id(i, j), id(x, y), a[x][y]);
            }
        }
        for(int i = 0; i < n; ++i) {if(~a[i][0])    add(id(i, 0), 0, 0); if(~a[i][m - 1])    add(id(i, m - 1), 0, 0);}
        for(int i = 0; i < m; ++i) {if(~a[0][i])    add(id(0, i), 0, 0); if(~a[n - 1][i])    add(id(n - 1, i), 0, 0);}
        scanf("%d", &k);
        for(int i = 1; i <= k; ++i) scanf("%d %d", &x[i], &y[i]), G[i].spfa(id(x[i], y[i]), n * m);
        for(int i = 0; i < n; ++i) {if(~a[i][0])    add(0, id(i, 0), a[i][0]); if(~a[i][m - 1])    add(0, id(i, m - 1), a[i][m - 1]);}
        for(int i = 0; i < m; ++i) {if(~a[0][i])    add(0, id(0, i), a[0][i]); if(~a[n - 1][i])    add(0, id(n - 1, i), a[n - 1][i]);}
        x[0] = 0, y[0] = -1; G[0].spfa(id(x[0], y[0]), n * m);
        ++k; for(int i = 0; i < k; ++i) for(int j = 0; j < k; ++j)  cost[i][j] = G[i].dis[id(x[j], y[j])];
        memset(dp, inf, sizeof(dp));
        dp[1][0] = 0;
        for(int i = 0; i < (1<<k); ++i)
        {
            for(int j = 0; j < k; ++j)
            {
                if(dp[i][j] == inf) continue;
                for(int l = 0; l < k; ++l)
                {
                    if(i & (1<<l))  continue;
                    dp[i|(1<<l)][l] = min(dp[i|(1<<l)][l], dp[i][j] + cost[j][l]);
                }
            }
        }
        int ans = inf;
        for(int i = 0; i < k; ++i)  ans = min(ans, dp[(1<<k) - 1][i] + cost[i][0]);
        printf("%d\n", ans == inf ? 0 : ans);
    }
    return 0;
}

 

不止于ACC:用CarSim的‘Multiple Objects’和路径跟踪器玩转复杂交通流场景 本文深入探讨了如何利用CarSim的'Multiple Objects'模块和路径跟踪器模拟复杂交通流场景,超越传统ACC测试的局限。通过批量控制、动态交互和参数化设计,实现多车智能响应和复杂轨迹模拟,适用于连续变道、拥堵博弈、匝道汇流等真实交通场景。 阅读详情

相关推荐

AES攻击方法 :差分密码分析 boomerang attack飞去来器攻击

AES具有123比特的分组长度,三种可选的密钥长度(128,192,256) AES是一个迭代型密码,轮数依赖于密钥长度。如果密钥长度为128比特,则轮数为10;如果密钥长度为192比特,则轮数为12;如果密钥长度为256比特,则轮数为14; 混淆(Confusion) 混淆是为了让密钥与密文的统计信息之间的关系变得复杂,从而增加通过统计方法进行攻击的难度。混淆可以通过各种代换算法实现,如S盒、乘法(加)与异或等运算组合,为非线性部件。 扩散(Diffusion) 扩散是为了让明文的单个比特影像到

m0_67105022的博客 3492

Codeforces Round #482 (Div. 2) 979B - Treasure Hunt [思维]

B. Treasure Hunttime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputAfter the big birthday party, Katie still wanted Shiro to have some more fun. Later...

howell 432

STM32 HardFault调试:寄存器分析与堆栈回溯实战

HardFault是Cortex-M内核中最关键的不可屏蔽异常,本质是处理器对非法指令执行、内存访问越界、堆栈溢出等底层硬件错误的强制响应。其原理根植于ARMv7-M异常模型,通过自动压栈保存xPSR/PC/LR等核心寄存器实现上下文捕获。技术价值在于为嵌入式系统提供确定性故障归因能力,支撑高可靠工业设备开发。典型应用场景涵盖FreeRTOS任务崩溃定位、DMA中断越界诊断及MPU保护机制验证。本文聚焦STM32平台,深入解析LR寄存器低4位判别堆栈模式、基于MSP/PSP的PC地址提取方法,并结合Keil

weixin_30951515的博客 144

HDU-4568 TSP+最短路

题意:给一个n行m列的矩阵,矩阵上的数字代表经过代价(这里要注意每经过一次都要付出代价),矩阵上有几个宝藏,猎人可以从任意边界进去矩阵取完所有宝藏后从任意边界出来。 解法:一看到宝藏数量小于等于13且必须经过,应该很容易想到TSP问题。所以我们用最短路预处理+状态压缩DP解决。首先预处理所有宝藏点到整个地图的最短路这是为了后续的dp代价做准备,然后开始状压dp,设计dp状态为dp[S][now]...

weixin_30800987的博客 200

十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序

冒泡排序、选择排序、插入排序、快速排序、希尔排序

HK的博客 18万+

海思ISP实战:YUV Sharpen参数调试全解析

本文深入解析了在海思ISP平台上进行YUV Sharpen参数调试的实战经验。文章以海思3516EV300芯片为例,详细拆解了EdgeFiltStr、TextureFreq等核心参数的作用与协同策略,并重点阐述了如何通过ISO联动调试,在图像清晰度与噪声抑制之间取得最佳平衡,为图像调试工程师提供了宝贵的避坑指南和实战参考。

grape的博客 213

侏儒の言葉---あなたの一生に感動する「三」

人生の幸福にするためには、日常の瑣事を愛さねばならぬ。曇りの光、竹の戦ぎ、群雀の声、行人の顔---あらゆる日常の瑣事の中に無常のを感じなければならぬ。人生を幸福にするためには?--しかし、瑣事を愛するものは瑣事のために苦しまなければならぬ。庭前の小池に飛び込んだ蛙は百年の愁を破ったであろう。が、小池の飛び出した蛙は百年の愁を与えたかもしれない。いや、芭蕉の一生は享楽の一生であるとともに、誰の目にも...

hhwgaoshu的专栏 4万+

华为OD新系统机试真题-勇攀数字高峰(Java/Py/C/C++/Js/Go)

新系统 华为OD机试新系统【勇登数字高峰】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【勇登数字高峰】

qq_45776114的博客 1550

HDU 4568 Hunter

题目: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题意: n*m的棋盘中放着一些宝藏,每个点都有经过的耗时,要求从任意位置进入棋盘后拿到所有宝藏然后离开棋盘,每个点可以经过多次,求最小耗时,-1的点是不可走的。 思路: 图的大小是200*200但是宝藏最多只有13个,所以很容易想到重新建图,把13各点互相之间的距离求出来建图然后有一个虚

MyWorld 509

【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上)

【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上)

AI人人懂 2190

第十届MathorCup高校数学建模挑战赛-B题:养老服务床位需求预测与运营模式研究

当养老床位数增加时存在的商机,提出了相应的养老服务床位的运营商业模式。就业的可能性,建立多目标规划模型,尽可能同时满足三方面的要求。务床位的需求、制定合理的养老服务床位发展规划,是构建和谐社会、幸福社会。问题一的床位需求与市场类型的分类结果,查找关于国内养老院的相关数据,探。求,又能持续发展养老事业,同时还能促进社会就业的养老服务床位运营的商业。养老服务床位数的增加能够带来的就业方面因素的影响,并对这些因素进行一个。你们的模型及其结论为科学依据,对政府管理部门针对养老床位规划提出合理的。

getusushu的博客 1140

hdu 4568 Hunter(spfa预处理 + 状压dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:

几百个教授的专栏 493

UCIE Specification详解(三)

Protocol Layer(协议层)以及Die-to-Die Adapter

Crazzy_M的博客 1768

hdu 4568 Hunter

题目:点击打开链接 题意:给定一个矩阵图,每走一个格子有一个花费,可以从任意边进入,任意边出去,并且图中有k个点要求全部走到,问最少的花费是多少,如果不能够全部走到,输出0。 思路:先用spfa对图做预处理,求出所有必须走的点和地图外构成的图的任意两点的最短路,然后就是枚举必须走的点的访问顺序问题,由于k很小,可以用状态压缩DP,dp[i][j]表示最后选的点是i,j表示已经选的点。

u011406727的专栏 455

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Hdu 4568 Hunter(状压dp)

题目链接 Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1276    Accepted Submission(s): 376 Problem Description   One day, a hun

madaidao的专栏 483

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Hdu 4568 Hunter 2013长沙邀请赛

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568   Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 958    Accepted Submission(s)

我是一颗小星星~ 1291

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

HDU 4568 Hunter 解题报告

题目 比赛 题意: 一个n×m的网格图,每个格子有一个数字,表示从这个格子出发到相邻格子所需时间,-1表示不能经过。有一些格子上有宝藏,求拿完所有能拿的宝藏所需的最少时间。 题解: 由于宝藏很少,所以可以状压。首先以每个宝藏为起点做一次SPFA,就可以得到两个宝藏间的最短路(单向),还有离开网格图的最短路(如果不能离开就是不能取)。然后状压,dp[i][j]表示最后选的宝藏是i,j表

Tri_integral的专栏 974

HDU 4568 Hunter 最短路+状压DP

题意:给一个n*m的格子,格子中有一些数,如果是正整数则为到此格子的花费,如果为-1表示此格子不可到,现在给k个宝藏的地点(k 解法:看到k的范围应该想到状态压缩,将每个格子都看成一个点,再新建两个点,一个表示边界外的起点,用0表示,一个表示边界外的终点,用n*m+1表示,然后相互建边,建有向边,边权为终点格子的花费值,(其实都不用建边,直接跑最短路也行)然后求这k+2个点两两之间的最短距离,然

whatbeg 679

HDU 4568 Hunter

Problem Description One day, a hunter named James went to amysterious area to find the treasures. James wanted to research the area andbrought all treasures that he could. The area can be represente

涅槃phy的专栏 1499

2013长沙赛区 HDU4568-Hunter SPFA+TSP

先对每个必须经过的点SPFA一下到其他必须经过的点和边界,然后jiang

huantwofat 666

Hdu 4568 Hunter【spfa最短路 tsp状态压缩】

Description   One day, a hunter named James went to a mysterious area to find the treasures. James wanted to research the area and brought all treasures that he could.   The area can be represen

MissZhou要努力 1025

hdu 4568 hunter

第一次做最短路的题型,花了好久学习最短路。做题,测试时发现有bug,找了4个小时,终于找了出来。尼玛,开心死了! 先用spfa算法算出每个宝藏点之间的最短路径,然后就变成了裸的状态压缩dp了。 建议先做1074题和3182题。 ro[i][0]表示第i个宝藏点距离边界的最短距离。 状态压缩思路同1074和3182差不多。#include<iostream> #include<algorith

qq_31457873的博客 496

HDU 4568 Hunter TSP_DP

原题: Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 958    Accepted Submission(s): 269 Problem Description   One day, a

u011343989的专栏 696

HDU-4568-Hunter

题意大致是说给你一个矩阵,其中某些位置有一些宝藏,让你尽可能

z309241990的专栏 647

hdu 4568 Hunter(最短路+记忆化搜索)

题意:给出一个n×m

绝望的乐园 1087
上一篇: Permutation (HDU - 3811,状压 DP)
下一篇: A Horrible Poem (HYSBZ - 2795,字符串哈希 + 枚举最小循环节小技巧~)
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值