WOJ 1546 Maze 图论上的状态压缩DP
http://acm.whu.edu.cn/land/problem/detail?problem_id=1546
这个题目还是聪哥教的方法过的
首先搜索是必须的,而且通过搜索来缩点,这些应该要想到,即把图上的起点和终点还有能量点进行标记,之后用bfs找到这些个点的最短路,最多只有12个点,这样对12个点进行状态压缩DP,状态压缩这部分不是很好写
用dp[i][j]表示在状态i的情况下,此刻在j点落脚的最大能量数,则先枚举i再枚举j,再枚举k,k代表已经存在于i里面的点 每次从dp[i][k]过度到dp[i][j],从dp[i][k]+dis[k][j]+dis[j][m+1]<=L(m+1是终点)则可以进行转移,取得该能量。
整个状态转移走完找出最大的能量数跟需求判断下即可得出结果
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define INF 1<<30
using namespace std;
char g[][];
int vis[][];
int num[];
int d[][];
int dp[<<][];
int dis[<<][];
int w,h,l,m,s;
struct node
{
int x,y,deep;
} v[];
int dir[][]={{,},{,-},{,},{-,}};
void bfs(int x,int y)
{
node sx=node{x,y,};
queue<node> q;
q.push(sx);
memset(vis,,sizeof vis);
char cc=g[x][y];
while (!q.empty())
{
node nx=q.front();
q.pop();
if (vis[nx.x][nx.y]) continue;
vis[nx.x][nx.y]=;
for (int i=;i<;i++)
{
node qx=(node){nx.x+dir[i][],nx.y+dir[i][],nx.deep+};
if (qx.x< || qx.x>=h || qx.y< || qx.y>=w) continue;
if (vis[qx.x][qx.y]) continue;
char ch=g[qx.x][qx.y];
if (ch=='#') continue;
if (ch>='a' && ch<='a'+m+)
{
if (d[cc-'a'][ch-'a']>qx.deep)
d[cc-'a'][ch-'a']=qx.deep;
//cout<<cc-'a'<<" "<<ch-'a'<<" "<<d[cc-'a'][ch-'a']<<" aaa"<<endl;
}
q.push(qx);
}
}
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d%d%d%d",&w,&h,&l,&m,&s);
for (int i=;i<=m;i++)
scanf("%d",&num[i]);
for (int i=;i<h;i++){
scanf("%s",g[i]);
}
int tmp=;
for (int i=;i<h;i++)
for (int j=;j<w;j++)
d[i][j]=INF;
for (int i=;i<h;i++)
{
for (int j=;j<w;j++)
{
if (g[i][j]=='$')
g[i][j]='a';
if (g[i][j]=='@')
g[i][j]='a'+(tmp++);
if (g[i][j]=='<')
g[i][j]='a'+m+;
}
}
for (int i=;i<=h;i++)
{
for (int j=;j<=w;j++)
{
if (g[i][j]>='a' && g[i][j]<='a'+m+){
// cout<<i<<" "<<j<<endl;
bfs(i,j);
//进行BFS缩点 //cout<<endl;
}
}
}
int ret=;
//对可以直接取得点先取了 for (int i=;i<=m;i++)
{
if (d[i][m+]<=l/)
{
ret+=num[i];
num[i]=;
}
}
int ans=;
memset(dp,-,sizeof dp);
memset(dis,,sizeof dis);
for (int i=;i<m;i++)
{
dis[<<i][i+]=d[][i+];
if (d[][i+]+d[i+][m+]<=l){
ans=max(ans,num[i+]);
dp[<<i][i+]=num[i+];
}
}
for (int i=;i<(<<m);i++)
{
for (int j=;j<=m;j++)
{
if (!(<<(j-) & i)) continue;
int tmp=i-(<<j-);
if (tmp==) continue;
int td=d[j][m+];
for (int k=;k<=m;k++)
{
if (dp[tmp][k]==-) continue;
if (!(tmp&(<<k-))) continue;
if (dis[tmp][k]+d[k][j]<=l-td)
{
if (dp[i][j]==-)
{
dp[i][j]=dp[tmp][k]+num[j];
dis[i][j]=dis[tmp][k]+d[k][j];
}
else
if (dp[i][j]<dp[tmp][k]+num[j])
{
dp[i][j]=dp[tmp][k]+num[j];
dis[i][j]=dis[tmp][k]+d[k][j];
}
}
}
ans=max(ans,dp[i][j]);
}
}
if (ret+ans<s || d[][m+]>l)
puts("NO");
else
puts("YES");
}
return ;
}
WOJ 1546 Maze 图论上的状态压缩DP的更多相关文章
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- 旅行商问题——状态压缩DP
问题简介 有n个城市,每个城市间均有道路,一个推销员要从某个城市出发,到其余的n-1个城市一次且仅且一次,然后回到再回到出发点.问销售员应如何经过这些城市是他所走的路线最短? 用图论的语言描述就是:给 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- BZOJ-1226 学校食堂Dining 状态压缩DP
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...
- HDU 1074 (状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...
随机推荐
- C++代做,C++编程代做,C++程序代做,留学生C++ Lab代写
C++代做,C++编程代做,C++程序代做 我们主要面向留学生,广泛接美加澳国内港台等地编程作业代写,中英文均可. C语言代写 C++代写 Python代写 Golang代写 Java代写 一年半的时 ...
- 001-PHP静态变量
<?php function ADD1() { static $a = 10; //定义静态变量 $a += 1; echo "静态变量a的值为:" . $a . " ...
- 树莓派1 安装使用 ZeroTier
基于P2P网络的Private LAN工具:ZeroTier Linux (DEB and RPM distributions) We've found a way to make the easy ...
- 微信小程序学习开发笔记
首先注册小程序开账号,下载开发工具之后,先啃官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/ ,把小程序的基本的代码框架 ...
- Ajax学习系列——Ajax介绍及优缺点
一.什么是Ajax Ajax即“Asynchronous JavaScript And XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术. Ajax = 异步Jav ...
- 八十二、SAP中的ALV创建之一,新建一个程序
一.创建一个ALV的程序 二.填写程序属性 三.保存到本地对象 四.来到代码区,这样一个新工程就创建好了,我们后续来写相关的创建代码
- oracle数据泵导出导入
先创建一个目录:比如 Create or Replace directory DATA_PUMP_DIR as 'D:\DataPipe'; 然后给导入导出的用户赋权限: Grant read ...
- webapi------宿主程序
业务场景: 公司的容器程序需要给前端暴露接口但是代码里面又不想写webapi项目工程就用到了宿主可以达到webapi的效果 1.owin实现 2.其他实现 测试实现如下 1.新建一个控制台程序 2.新 ...
- HDU 4866 多校1 主席树+扫描线
终于是解决了这个题目了 不过不知道下一次碰到主席树到底做不做的出来,这个东西稍微难一点就不一定能做得出 离散化+扫描线式的建树,所以对于某个坐标二分找到对应的那颗主席树,即搜索出结果即可(因为是扫描线 ...
- Windows系统安装免费的开源虚拟机软件VirtualBox
https://www.qikegu.com/uncategorized/1179 VirtualBox是什么 VirtualBox是一个虚拟机平台软件,在VirtualBox平台上可以安装各种操作系 ...