HDU 4568 Hunter(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)
The area can be represented as a N*M rectangle. Any points of the rectangle is a number means the cost of research it,-1 means James can't cross it, James can start at any place out of the rectangle, and explore point next by next. He will move in the rectangle and bring out all treasures he can take. Of course, he will end at any border to go out of rectangle(James will research every point at anytime he cross because he can't remember whether the point are researched or not).
Now give you a map of the area, you must calculate the least cost that James bring out all treasures he can take(one point up to only one treasure).Also, if nothing James can get, please output 0.

#include <cstdio>
#include <queue>
#include <utility>
#include <iostream>
#include <cstring>
using namespace std;
typedef pair<int, int> PII; const int MAXN = ; int mat[MAXN][MAXN], tx[], ty[];
int dis[MAXN][MAXN], di[][];
bool ist[MAXN][MAXN];
int post[MAXN][MAXN];
int n, m, k; #define pos(x, y) (x*MAXN+y) int fx[] = {-,,,};
int fy[] = {,,,-}; void min_path(int st_x, int st_y, int now) {
priority_queue<PII> que;
que.push(make_pair(-mat[st_x][st_y], pos(st_x, st_y)));
memset(dis, 0x3f, sizeof(dis));
dis[st_x][st_y] = mat[st_x][st_y];
while(!que.empty()) {
int abc = -que.top().first, tmp = que.top().second; que.pop();
int x = tmp / MAXN, y = tmp % MAXN;
if(abc != dis[x][y]) continue;
for(int i = ; i < ; ++i) {
int newx = x + fx[i], newy = y + fy[i];
if( <= newx && newx < n && <= newy && newy < m) {
if(mat[newx][newy] == -) continue;
if(dis[newx][newy] > mat[newx][newy] + dis[x][y]) {
dis[newx][newy] = mat[newx][newy] + dis[x][y];
que.push(make_pair(-dis[newx][newy], pos(newx, newy)));
if(ist[newx][newy] && dis[newx][newy] < di[now][post[newx][newy]])
di[now][post[newx][newy]] = dis[newx][newy];
}
}
else if(dis[x][y] < di[now][k]) di[now][k] = dis[x][y];
}
}
} int dp[][];
int ans, sum; int dfs(int u, int use) {
if(dp[u][use] < 0x3f3f3f3f) return dp[u][use];
if(use == ) {
return dp[u][use] = di[u][k];
}
for(int i = ; i < k; ++i) {
if(use & ( << i))
dp[u][use] = min(dp[u][use], di[u][i] + dfs(i, use ^ ( << i)));
}
return dp[u][use];
} void solve() {
memset(dp, 0x3f, sizeof(dp));
ans = 0x7fff7fff;
for(int i = ; i < k; ++i)
ans = min(ans, di[i][k] + dfs(i, ( << i) ^ (( << k) - )));
} void printdi() {
for(int i = ; i < k; ++i) {
for(int j = ; j <= k; ++j) printf("%d ", di[i][j]);
printf("\n");
}
} int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
for(int i = ; i < n; ++i)
for(int j = ; j < m; ++j) scanf("%d", &mat[i][j]);
scanf("%d", &k);
memset(ist, , sizeof(ist));
sum = ;
for(int i = ; i < k; ++i) {
scanf("%d%d", &tx[i], &ty[i]);
ist[tx[i]][ty[i]] = true;
post[tx[i]][ty[i]] = i;
sum += mat[tx[i]][ty[i]];
}
memset(di, 0x3f, sizeof(di));
for(int i = ; i < k; ++i) min_path(tx[i], ty[i], i);
//printdi();
solve();
printf("%d\n", ans - sum);
}
}
HDU 4568 Hunter(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)的更多相关文章
- HDU 4571 Travel in time ★(2013 ACM/ICPC长沙邀请赛)
[题意]给定N个点,每个点有一个停留所需的时间Ci,和停留能够获得的满意度Si,有M条边,每条边代表着两个点走动所需的时间ti,现在问在规定的T时间内从指定的一点S到E能够获得的最大的满意度是多少?要 ...
- HDU 4758——Walk Through Squares——2013 ACM/ICPC Asia Regional Nanjing Online
与其说这是一次重温AC自动机+dp,倒不如说这是个坑,而且把队友给深坑了. 这个题目都没A得出来,我只觉得我以前的AC自动机的题目都白刷了——深坑啊. 题目的意思是给你两个串,每个串只含有R或者D,要 ...
- HDU 4571 Travel in time(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)
Problem Description Bob gets tired of playing games, leaves Alice, and travels to Changsha alone. Yu ...
- hdu 4751 Divide Groups bfs (2013 ACM/ICPC Asia Regional Nanjing Online 1004)
SDUST的训练赛 当时死磕这个水题3个小时,也无心去搞其他的 按照题意,转换成无向图,预处理去掉单向的边,然后判断剩下的图能否构成两个无向完全图(ps一个完全图也行或是一个完全图+一个孤点) 代码是 ...
- 2013 ACM/ICPC 长沙网络赛J题
题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...
- 2013 ACM/ICPC 长沙现场赛 A题 - Alice's Print Service (ZOJ 3726)
Alice's Print Service Time Limit: 2 Seconds Memory Limit: 65536 KB Alice is providing print ser ...
- 2013 ACM/ICPC 长沙现场赛 C题 - Collision (ZOJ 3728)
Collision Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge There's a round medal ...
- HDU 4573 Throw the Stones(动态三维凸包)(2013 ACM-ICPC长沙赛区全国邀请赛)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4573 Problem Description Remember our childhood? A fe ...
- HDU 4569 Special equations(枚举+数论)(2013 ACM-ICPC长沙赛区全国邀请赛)
Problem Description Let f(x) = anxn +...+ a1x +a0, in which ai (0 <= i <= n) are all known int ...
随机推荐
- Elasticsearch 6 重要参数配置
采用zip或tar.gz的二进制包方式安装的ES,需要配置一系列参数,其中重要参数配置如下: 一. ElasticSearch参数配置 1. data和logs路径配置 如果使用.zip或.tar.g ...
- mysql 多主多从配置,自增id解决方案
MySQL两主(多主)多从架构配置 一.角色划分 1.MySQL数据库规划 我现在的环境是:zhdy04和zhdy05已经做好了主主架构配置,现在需要的是把两台或者多台从服务器与主一一同步. 主机名 ...
- php.ini修改后,重启无效
今天做项目,上传图,需要修改php.ini.发现修改后,多次长期服务器也没用,在网上找了好多方案.介绍一下我的流程 1.使用phpinfo()找到php.ini的位置,如果位置不准确,修改肯定没有任何 ...
- 集合之TreeMap
TreeMap 底层数据结构是二叉树 如何保证键的唯一: 利用存的特点 如何保证键的可排序: 利用取的特点 左跟右 在map中数据结构只对键有效TreeMap 有Map的键值对的特性:还可以进行排序, ...
- 【C】switch-case里面,加或不加break的区别
int test; test = ; switch(test) { : test++; printf("value = 0"); // 打印printf,后续没有break代码,系 ...
- OpenWrt超时检测
参考http://www.right.com.cn/forum/thread-261702-1-1.html vim /home/ihid/chaos_calmer/feeds/luci/module ...
- 在vue项目中添加eslint规则
自己配置脚手架时候如何安装eslint语法规则, 第一步安装 官方推荐的安装包如下 eslint eslint-config-standard eslint-plugin-standard eslin ...
- tomcat8.5配置高并发
最近部署的tomcat应用,有一天压测的时候,测试一致反馈下载不了,结果查看日志才发现如下错误: INFO: Maximum number of threads (200) created for c ...
- MapWindow记录
增加MapWinGIS的新功能,编译完MapWinGIS,可以生成Debug和Release版本的x64和Win32四种版本, 自己基于c#的Mapwindow如果要用到新添加的功能,此时就得重新注册 ...
- OracleLinux上安装Oracle11g图解
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页 [作者 高健@博客园 luckyjackgao@gmail. ...