题目链接:点击查看

题目大意:有n个点,m条边,一个人要在时间T内从1走到n,并在途中进行交易,获得尽可能多的钱。这个人身上最多能带B包盐,每到一个地方都需要交纳一定的钱数,并且经过一定的时间才能通过,每个地方的盐价不同,在这个地方他可以对身上的盐进行买/卖/不买也不卖这三种操作,要求无论任何时候身上的钱数都不能小于0。除此之外,还有K个平行世界,编号为0~K-1,这个人初始化在第0个世界,并且要求到达n点时也要在第0个世界,不同世界不同点的盐价不同,但相应道路的花费相同,这个人可以花费1点时间单位到达第(K+1)%K个平行世界,在满足所有条件的基础上,求最后剩余钱数的最大值

另外需要注意的几个细节:

  1. 在点1和点n不能对盐进行买或卖的操作
  2. 在点1和点n不能穿越时空进入到平行世界
  3. 因为图为有向图,所以到达点n后不再扩展
  4. 目的地必须是第0个平行世界中的点n

题目分析:题意说的很清楚了,从起点开始向外用bfs一层一层的扩展就好了,只不过需要维护的状态多一点,一般走迷宫的bfs维护的都是一个二维数组,两个维度分别维护x坐标和y坐标,数组内部维护的是最优解,即从起点扩展到该点的答案,因为是bfs,所以每个点至多只能被走一次,所以可以将状态数组和vis数组合为一体,即初始化时将状态数组赋值为一个状态无法转移到的数值,这个题目中就是非正数即可,还有几个细节需要注意一下,当扩展到终点时不要直接退出,等bfs跑完后才可能会出现最优解,还有就是寻找最优解时只需要遍历一遍到达终点的时间这一维变量即可,因为我开的是dp[n][k][b][time],满足最优解,n和k肯定是终点,这个没法变动,b一定是0的时候才能保证钱最多,不然身上的盐都浪费掉了,只要枚举time这个变量维护一下最大值即可

上代码吧:注意写一下注释防止把自己写晕

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<string>
using namespace std;
typedef long long LL;const int inf=0x3f3f3f3f;int N,M,B,K,R,T;int p[10][110];//p[k][n]int dp[110][10][10][210];//dp[n][k][b][time] struct No
{int n,k,b,time;No(int _n,int _k,int _b,int _time){n=_n;k=_k;b=_b;time=_time;}bool operator<(const No &a)const{return time>a.time;}
};struct Node
{int to,t,cost;Node(int TO=0,int T=0,int C=0){to=TO;t=T;cost=C;}
};vector<Node>node[110];int bfs()
{memset(dp,0,sizeof(dp));priority_queue<No>q;dp[1][0][0][0]=R;q.push(No(1,0,0,0));bool flag=false;while(!q.empty()){No tem=q.top();q.pop();int u=tem.n;int k=tem.k;int time=tem.time;int b=tem.b;if(time>T)break; if(u==N)//到了n点就不在迭代 continue;//不穿越 for(int i=0;i<node[u].size();i++){Node temp=node[u][i];int v=temp.to;if(time+temp.t>T)continue;int cost=dp[u][k][b][time]-temp.cost;if(cost<0)continue;if(v==N&&k!=0)continue;if(v==N)//到达终点标记一下,不要continue或breakflag=true;if(u!=1&&u!=N){//买if(b+1<=B&&dp[v][k][b+1][time+temp.t]<cost-p[k][u]) {if(!dp[v][k][b+1][time+temp.t])q.push(No(v,k,b+1,time+temp.t));dp[v][k][b+1][time+temp.t]=cost-p[k][u];}//卖if(b>0&&dp[v][k][b-1][time+temp.t]<cost+p[k][u]) {if(!dp[v][k][b-1][time+temp.t])q.push(No(v,k,b-1,time+temp.t));dp[v][k][b-1][time+temp.t]=cost+p[k][u];}}//不买不卖if(dp[v][k][b][time+temp.t]<cost){if(!dp[v][k][b][time+temp.t])q.push(No(v,k,b,time+temp.t));dp[v][k][b][time+temp.t]=cost;   }}//穿越int k1=(k+1)%K;int cost=dp[u][k][b][time];if(time+1>T)continue;if(u!=1&&u!=N){//买if(b+1<=B&&dp[u][k1][b+1][time+1]<cost-p[k][u]) {if(!dp[u][k1][b+1][time+1])q.push(No(u,k1,b+1,time+1));dp[u][k1][b+1][time+1]=cost-p[k][u];}//卖if(b>0&&dp[u][k1][b-1][time+1]<cost+p[k][u]) {if(!dp[u][k1][b-1][time+1])q.push(No(u,k1,b-1,time+1));dp[u][k1][b-1][time+1]=cost+p[k][u];}}//不买不卖if(dp[u][k1][b][time+1]<cost){if(!dp[u][k1][b][time+1])q.push(No(u,k1,b,time+1));dp[u][k1][b][time+1]=cost;  }}if(!flag)return -1;int ans=0;for(int i=0;i<=T;i++)ans=max(ans,dp[N][0][0][i]);return ans;
}int main()
{int w;cin>>w;int kase=0;while(w--){scanf("%d%d%d%d%d%d",&N,&M,&B,&K,&R,&T);//一定注意一个变量和一个%d对应,一开始少写了一个。。提前进入自闭模式 for(int i=0;i<K;i++)for(int j=1;j<=N;j++)scanf("%d",&p[i][j]);for(int i=1;i<=N;i++)node[i].clear();while(M--){int a,b,t,m;scanf("%d%d%d%d",&a,&b,&t,&m);node[a].push_back(Node(b,t,m));}printf("Case #%d: ",++kase);int ans=bfs();if(ans==-1)printf("Forever Alone\n");elseprintf("%d\n",ans);}return 0;
}

HDU - 4784 Dinner Coming Soon(bfs+动态规划+优先队列)相关推荐

  1. hdu 4784 Dinner Coming Soon

    spfa+优先队列.刚开始只用的spfa,结果tle到死.然后听队友说要用到优先队列,想了想,对时间分层的话的确每一个结点都只进队列一次即可,因为只有大时间才能更新出小时间,然后就wa成shi了.按队 ...

  2. 专题训练二 搜索进阶 HDU - 3085 Nightmare Ⅱ (双向BFS + 曼哈顿距离)

    HDU - 3085 Nightmare Ⅱ (双向BFS + 曼哈顿距离) Problem Description Last night, little erriyue had a horrible ...

  3. 【HDU - 4784】Dinner Coming Soon(记忆化搜索bfs,dp)

    题干: Coach Pang loves his boyfriend Uncle Yang very much. Today is Uncle Yang's birthday, Coach Pang ...

  4. HDU 2653 (记忆化BFS搜索+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2653 题目大意:迷宫中有普通点和陷阱.其中普通点可以走可以飞,但是陷阱只能飞.走耗时1,飞耗时2.但 ...

  5. hdu 1026 Ignatius and the Princess I(优先队列+bfs+记录路径)

    以前写的题了,现在想整理一下,就挂出来了. 题意比较明确,给一张n*m的地图,从左上角(0, 0)走到右下角(n-1, m-1). 'X'为墙,'.'为路,数字为怪物.墙不能走,路花1s经过,怪物需要 ...

  6. HihoCoder - 1828 Saving Tang Monk II(bfs+动态规划/bfs+优先队列)

    题目链接:点击查看 题目大意:孙悟空要走迷宫去救唐僧,给出n和m约束迷宫大小: 迷宫中: S代表起点 T代表终点 B代表氧气区,经过可以获得一罐氧气,最多储存5罐氧气 #代表毒气区,经过需要花费2个时 ...

  7. 广度优先搜索BFS进阶(一):多源BFS、优先队列BFS、双端队列BFS

    一.多源BFS 在上一篇博客:广度优先搜索BFS基础中,我们接触到的BFS均是单起点(单源)的,但是对于某一些问题,其有多个起点,此类问题我们称为多源BFS问题.先思考下面一道例题: 1.腐烂的橘子 ...

  8. HDU 5836 Rubik's Cube BFS

    Rubik's Cube 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5836 Description As we all know, Zhu is ...

  9. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

最新文章

  1. go linux环境搭建,Linux 下 Go 环境搭建以及 Gin 安装
  2. 喜报!第四范式助推百胜中国斩获2020 IDC数字化转型重磅大奖
  3. [POJ 3164]Command Network(最小树形图,朱刘算法)
  4. 常见的几种负载均衡算法
  5. python中扑克牌类设计_python中的图像界面设计(二)
  6. 在webstorm中配置sass的自动编译,并且可以指定编译后的css的目录.
  7. 2017.10.22 最多的方案 失败总结
  8. PAT1021. 个位数统计
  9. 史上最大漏洞危机:影响所有 iPhone、Android、PC 设备,修复困难重重
  10. 远程连接桌面不能全屏显示的解决方法
  11. 最常用的CSS字体库
  12. matlab 贝叶斯网络工具箱的安装
  13. dat图片 电脑端微信_写了一个电脑版微信的dat图片转换器
  14. UESTC878————温泉旅店(动态规划)
  15. 微信小程序跳转美团外卖小程序时出现白屏解决demo
  16. Retina、非Retina、点、像素、iPhone分辨率
  17. 输入一个整数判断它是奇数还是偶数
  18. IUSR_用户(Internet来宾账号)
  19. 跨境电商的支付方式有哪些?
  20. 苍蝇也有自己的“领空”吗?

热门文章

  1. Ribbon-饥饿加载
  2. Spring构造注入
  3. Spring用户自定义类型
  4. consumer和partition的数量建议
  5. 字节流读数据(一次读一个字节数组数据)
  6. HashSet集合存储数据的结构(哈希表)
  7. MapReduce排序-概述
  8. DataURL:概述
  9. throws关键字_异常处理的第一种方式,交给别人处理
  10. animate方法 jQuery中元素的创建 创建十个p标签 创建列表 动态创建列表