Problem 3373 骑士游戏

长期的宅男生活中,JYY 又挖掘出了一款 RPG 游戏。在这个游戏中 JYY 会扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽。

在这个游戏中,JYY 一共有两种攻击方式,一种是普通攻击,一种是法术攻击。两种攻击方式都会消耗 JYY 一些体力。采用普通攻击进攻怪兽并不能把怪兽彻底杀死,怪兽的尸体可以变出其他一些新的怪兽,注意一个怪兽可能经过若干次普通攻击后变回一个或更多同样的怪兽;而采用法术攻击则可以彻底将一个怪兽杀死。当然了,一般来说,相比普通攻击,法术攻击会消耗更多的体力值(但由于游戏系统 bug,并不保证这一点)。

游戏世界中一共有N种不同的怪兽,分别由 1到 N编号,现在 1号怪兽入侵村庄了,JYY 想知道,最少花费多少体力值才能将所有村庄中的怪兽全部杀死呢?

分析:

1.     显然杀死一种怪物有两种方法,直接消灭和杀死它和产生的所有怪物。
我们需要比较 Eliminate[i] 和 Kill[i] +Sum{ costs that need to eliminate following monsters}

2.     怪物们之间时有类似于“路径”的概念,杀死a,掉出b,c。自然a与b,a与c之间会有一条连接相连。

3.     现在思考在于怎么分别讨论“消灭”和“杀死”的情况。
对于单个元素a 只需要简单讨论eliminate[a] 以及kill[a]的大小
对于简单路径a->b 只需要讨论 eliminate[a], kill[a] + min(eliminate[b],kill[n]) 的大小

4.     但问题在于,当我们在使用“最短路径”来解决题目的时候,一般都是已知起点,终点。然后再去跑算法,寻找这个值的大小。这道问题却是你只知道起点,路上的任何一个地方都有可能是终点,也有可能不是终点。

5.     其次,我们求的也不是特定一段距离,特定的,我们只想了解到底是消灭1号怪物的开销大,还是杀死并消灭剩余敌人的开销大。

6.     从某种意义上而言,我们需要递归寻找。单可以看出其中的记忆性,动态规划的思想。如果我们从这个图最外面开始看起,一层一层往里计算消灭怪物的开销,自然而然题目就解决了

7.     但是,与普通简单DP不同的是,可能有环的存在
但事实上似乎并不用担心。不妨令每个点的初值都等于eliminate[i],在最短路径计算过程中:如SPFA,边的松弛都是依靠距离的。自然,正环的产生必定会大于最短距离,有得保证。

8.     凭什么保证你从这个点开始计算一定是最优的?不能保证!所以不如干脆就把所有点一开始就放在队列里。
那么怎么保证队列的顺序一定能出最优解?不能保证!所以不如干脆每次一旦更新成功,就把父节点再次入队列(只可能有一个父节点)。这样一来就无后顾之忧了。

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
#define N 201000
#define M 2010000
#define inf 0x3f3f3f3f
using namespace std;
typedef long long long_int;
long_int A[N];
long_int Dist[N];
bool inq[N];
int n = 0;
vector<int> G[N],P[N];
void Add(int u ,int v){G[u].push_back(v);P[v].push_back(u);
}void SPFA(){queue<int> Q;for (int i = 1 ; i <= n ; ++i){Q.push(i);inq[i] = true;}while(!Q.empty()){int u = Q.front();Q.pop();inq[u] = false;long long temp = A[u];for (int i = 0 ; i < G[u].size() ; ++i)temp += Dist[G[u][i]];if(temp >= Dist[u]) continue;Dist[u] = temp;for (int i = 0 ; i < P[u].size() ; ++i){if(!inq[P[u][i]]){inq[P[u][i]] = true;Q.push(P[u][i]);}}}
}int main(){cin >> n;int x = 0;for (int i = 1 ; i <= n ; ++i){int xx = 0;cin >> A[i] >> Dist[i] >> x;while(x--){cin >> xx;Add(i,xx); }}SPFA();cout << Dist[1] << endl;return 0;
}

【ECNU OJ 3373】 骑士游戏 最短路径+动态规划相关推荐

  1. LeetCode--174.地下城游戏(动态规划)

    地下城游戏(动态规划) 1. 题目描述 2. 题目分析 3. C语言实现 1. 题目描述 难度:困难 2. 题目分析 这道题是64.最小路径和的进阶版.但是这一题我们不能从左上向右下的顺序,而是**要 ...

  2. 跳跃游戏 (动态规划剪枝/前缀和/滑动窗口/BFS剪枝)

    一.跳跃游戏简单介绍 1. 跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步, ...

  3. 3875: [Ahoi2014]骑士游戏

    3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 599  Solved: 319 [Submit][Stat ...

  4. 新千题计划 2#:[AHOI JSOI14] 骑士游戏

    骑士游戏[难度:NOIP D2T1]有 nn<script type="math/tex" id="MathJax-Element-3">n< ...

  5. BZOJ 3875: [Ahoi2014Jsoi2014]骑士游戏 dp spfa

    3875: [Ahoi2014&Jsoi2014]骑士游戏 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 933  Solved: 475 ...

  6. BZOJ 3875 Ahoi2014 骑士游戏

    3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec  Memory Limit: 256 MB Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款 ...

  7. 题解 洛谷 P4042 [AHOI2014/JSOI2014]骑士游戏

    洛谷P4042[AHOI2014/JSOI2014]骑士游戏\color{#00F}{洛谷\ P4042\ [AHOI2014/JSOI2014]骑士游戏}洛谷 P4042 [AHOI2014/JSO ...

  8. 【BZOJ3875】[Ahoi2014Jsoi2014]骑士游戏 SPFA优化DP

    [BZOJ3875][Ahoi2014&Jsoi2014]骑士游戏 Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会扮演一个英勇的骑 ...

  9. [AHOI2014/JSOI2014]骑士游戏 深入理解spfa

    [AHOI2014/JSOI2014]骑士游戏 杀死魔物有两种方式 魔法或者物理攻击再让它去世 则 dis = min(魔法 , 物理+所有子代魔法); 就像dp,然而可能成环.考虑spfa成环距离必 ...

最新文章

  1. WEB-INF目录下登录表单提交的重定向
  2. linux:系统对open files的限制
  3. 新浪微博WeiboManageAction的java实现
  4. 【代码审计】PHP代码审计---基础记录
  5. c语言中的无符号字节,C语言之有符号数和无符号数
  6. 支持python开发的环境有哪些特点_Python虚拟环境详细教程,一篇带你入坑
  7. Idea创建一个springboot多模块项目
  8. jpa 人大金仓数据库方言_生态丨参展CITE2020 人大金仓全栈数据库管理系统强势来袭!...
  9. keras 多GPU训练,单GPU权重保存和预测
  10. spring3.0学习之环境搭建
  11. 在mini2440上面搞定CC2500物理层驱动
  12. C语言实现【关机程序】
  13. 传输线变压器设计原理
  14. SpringMVC(07) -- RESTful
  15. Android kotlin 时间戳转换工具
  16. c语言中flash文件系统,适宜于嵌入式多媒体应用的Flash文件系统
  17. 试用artipub一文多发平台
  18. 博途软件中多重背景块的建立_TIA博途软件中创建多重背景函数块
  19. 国标、行标、地标、团标、企标以及国际标准的基础知识
  20. springboot读取linux文件_spring\-boot以jar包方式时读取resource或是template文件 | Prayer's Laputa...

热门文章

  1. cmake基础教程(11)add_subdirectory如何添加非子目录的CMakeLists.txt
  2. matlab制作天体运动动画,天体运动 动态演示
  3. 题解 CF38C 【Blinds】
  4. win7原版镜像_AMD平台B450主板安装WIN7教程
  5. LGBM函数及参数详解
  6. 为什么这个男人爱“拈花惹草”还受阿里人追捧?
  7. python数据分析师下载_2020云开见明Python数据分析师特训营,全套课程资源下载...
  8. 远程办公那些事儿 大Boss最担心的是什么?
  9. 时间弥散谱成像和IMPULSED
  10. 什么是Arduino