【记忆化】恶魔城(satanic.pas/c/cpp)
2012-11-06 18:38
134 查看
3: 恶魔城(Satanic Castle)
(santanic.pas/cpp/c)
问题描述:
上帝需要创造一位战士去消灭撒旦,这位战士必须要穿过恶魔城才能与撒旦决斗。恶魔城内有M条连接N个路口(从1到N编号)的街道,每一条街道都是单向的(也就是说你不能逆着该街道指定的方向走),并且在城内无论怎么走都不可能走回原来走过的地方。开始的时候,战士的生命力(HP)为INITHP、站在1号路口,而撒旦在第N号路口等待着他。每一条街道上都有许多魔鬼,但是也有一些街道已经被上帝派去的天使占领了。当战士经过连接i号向j号路口的街道时,如果占领该街道的是恶魔,那么他的HP先加倍然后减少L[i,j],我们记为A[i,j]=-L[i,j];如果占领该街道的是天使,那么他的HP就会先加倍然后增加L[i,j],我们记为A[i,j]=+L[i,j];如果该街道不存在,那么A[i,j]=0。如果某一时刻战士的HP<=0,那么他会死亡。因为这个战士将非常无敌,当他见到撒旦的时候只要还活着,就能一口气把撒旦消灭,所以上帝不希望让他的INITHP过高。
任务:
给定N,A[1..N,1..N],求最小的INITHP,使这个战士能够活着见到撒旦。
输入格式:
从文件SATANIC.DAT读入数据,文件第一行有一个正整数N(3 ≤ N ≤ 100),下面跟着的第i行第j个数为A[i,j](绝对值不超过10000的整数)。
输出格式:
输出所求最小的INITHP。
样例
这一题应该可以用宽搜做,但这是记忆化专题,就用记忆化吧,并且代码还短些
考试的时候没考虑到中间可能会有生命值不够的情况,就只得了60分
注意几点:①生命值最小为1
②边界是到n这个点时返回1
③中间可能会出现f[i]<=0的情况,要更新成f[i]=1;
C++ Code
![](http://pic002.cnblogs.com/images/2012/418409/2012082110491230.jpg)
(santanic.pas/cpp/c)
问题描述:
上帝需要创造一位战士去消灭撒旦,这位战士必须要穿过恶魔城才能与撒旦决斗。恶魔城内有M条连接N个路口(从1到N编号)的街道,每一条街道都是单向的(也就是说你不能逆着该街道指定的方向走),并且在城内无论怎么走都不可能走回原来走过的地方。开始的时候,战士的生命力(HP)为INITHP、站在1号路口,而撒旦在第N号路口等待着他。每一条街道上都有许多魔鬼,但是也有一些街道已经被上帝派去的天使占领了。当战士经过连接i号向j号路口的街道时,如果占领该街道的是恶魔,那么他的HP先加倍然后减少L[i,j],我们记为A[i,j]=-L[i,j];如果占领该街道的是天使,那么他的HP就会先加倍然后增加L[i,j],我们记为A[i,j]=+L[i,j];如果该街道不存在,那么A[i,j]=0。如果某一时刻战士的HP<=0,那么他会死亡。因为这个战士将非常无敌,当他见到撒旦的时候只要还活着,就能一口气把撒旦消灭,所以上帝不希望让他的INITHP过高。
任务:
给定N,A[1..N,1..N],求最小的INITHP,使这个战士能够活着见到撒旦。
输入格式:
从文件SATANIC.DAT读入数据,文件第一行有一个正整数N(3 ≤ N ≤ 100),下面跟着的第i行第j个数为A[i,j](绝对值不超过10000的整数)。
输出格式:
输出所求最小的INITHP。
样例
SATANIC.DAT | SATANIC.OUT |
4 0 -4 0 -10 0 0 +3 0 0 0 0 -10 0 0 0 0 | 4 |
这一题应该可以用宽搜做,但这是记忆化专题,就用记忆化吧,并且代码还短些
考试的时候没考虑到中间可能会有生命值不够的情况,就只得了60分
注意几点:①生命值最小为1
②边界是到n这个点时返回1
③中间可能会出现f[i]<=0的情况,要更新成f[i]=1;
C++ Code
#include<cstdio> #define MAXN 100+10 #define oo 999999999 int n,map[MAXN][MAXN]; int f[MAXN]; int hp(int x) { if(x==n)return 1; if(f[x]!=oo)return f[x]; for(int i=1;i<=n;i++) { if(map[x][i]!=0) { double a=(hp(i)-map[x][i])/2.0; int ans; if(a-int(a)>=1e-6) ans=(int)a+1;else ans=(int)a; f[x]<?=ans; if(f[x]<=0) f[x]=1;//中间可能出现生命值不够的情况,要更新成1 } } return f[x]; } int main() { freopen("satanic.in","r",stdin); freopen("satanic.out","w",stdout); scanf("%d",&n); int i,j; for(i=1;i<=n;i++)f[i]=oo; for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&map[i][j]); printf("%d",hp(1)); return 0; }
![](http://pic002.cnblogs.com/images/2012/418409/2012082110491230.jpg)
相关文章推荐
- 【记忆化】【120819测试】【记忆化搜索专题】恶魔城(satanic.pas/c/cpp)
- 【记忆化】【120819测试】【记忆化搜索专题】能量项链(energy.pas/c/cpp)
- 【记忆化】【120819测试】【记忆化搜索专题】滑雪(ski.pas/c/cpp)
- 【记忆化】滑雪(ski.pas/c/cpp)
- 【记忆化】能量项链(energy.pas/c/cpp)
- 机器分配(machine.c/cpp/pas)
- 整数划分(文件名:separate.c/cpp/pas)
- 【区间DP】不老的传说(spring.cpp/pas)
- 2、种树(trees.pas/c/cpp)贪心
- 【遍历染色】【120817测试】【JSOI2007夏令营考试】题1:入门(a.pas/c/cpp)
- 【打表】数页码 count.pas/c/cpp
- 【枚举染色】嗅探器 sniffer.pas/c/cpp/in/out
- 【最小环】心灵的抚慰 heart.pas/c/cpp
- BSOI_2016.旅行 (comf.pas/c/cpp)
- 编辑距离问题(edit.pas/c/cpp)
- 时间计算(heaven.pas/cpp)
- 硬币找零(coin.c/cpp/pas)
- 淘汰赛制(elimination.pas/c/cpp)
- Problem 4 上白泽慧音(classroom.cpp/c/pas)
- 试题三:古代人的难题( puzzle.pas/c/cpp) 斐波那契数列