逃离地牢题解

本文介绍了ACM竞赛中的一道题目——逃离地牢,小明需要从左上角走到右下角,每经过一个房间都会受到累乘伤害。小明可以将伤害转化为金币,伤害转化为金币的规则是通过除以12并统计可以整除的次数。问题转换为求解动态规划,找到最优路径以获得最大金币。文章提供了解题思路和AC代码。
摘要由CSDN通过智能技术生成

逃离地牢

题目描述
小明明又被大威鱼抓住了,大威鱼把小明明关在地牢里,地牢由n * n 个房间组成,小明被困在地牢的最左上角的房间中,出口在最右下角,他想逃出这个诡异的地牢,但是他只能向下或者向右走。
小明每经过一个房间,都要受到一定的伤害(伤害都大于0),而且这个伤害可不是累加的哦,是累乘的,因此当他走出地牢的时候,他受到的伤害会非常大。但是小明有一个终极技能,能把受到的伤害X转变为金币,转化如下。
int val( type x )
{
int ret = 0;
while(x % 12 == 0) {
x /= 12;
ret++;
}
return ret;
}
请问小明最多能得到多少金币?
输入格式
输入包含多组测试用例,每组测试用例的第一行是一个整数n(n <= 50),接下来n行每行n个正整数 (<= 10 ^ 9) 表示每个房间对小名造成的伤害,当n 为 0 时输入结束。
输出格式
先输出Case,Case数从1开始,再输出小明获得的最大金币,具体输出形式见样例。
输入样例 复制
3
12 1 24
6 3 4
4 4 16
0
输出样例 复制
Case #1: 3
解题思路:
最开始的思路 比较简单 就是直接广搜 方向数组中只有往下和往右 结果没错内存超限了… 因为2的50次方了啊 队列撑不下了… 原地炸裂了 最后实在没做出来 …上网查后 加了些自己的理解吧… 这题要动态规划来做(专题名叫搜索算法二 没想到dp题这么多…) 这个有点像放假前老师讲的金字塔 求最后一行的累加上面得到最大值是多少 对于这个题来说 我要做的是每个点走的时候都走最优路 也就是看该点上面的值大 还是左边的值大 最后nn点就也一定是最优
由题意可知 伤害是累乘的 伤害转换金币的方式是看能%12多少次 而12我们可以分解成223 那么我们就可以很容易的看出 只要统计min(2的个数/2,3)就是我们要的答案,要是直接存2的个数3的个数 内存不够 让3的幂次作为一种状态 然后记录2的个数…说的可能有点绕 代码中有较全的注释
以下是AC代码:

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
//这个题最开始用广搜写的内存超限了 ... 毕竟这不像是那种走迷宫题走出去就完事了 这个是2的50次方 因为每个
//点都有两个方向可以选择     没A出来 最后从网上看的 加一些自己的理解吧  这个题是个DP  
//这个结构体中x表示的是在 ij点上的数可以分解多少个2    y 是 3
//之所以要这么分解是因为 题中给的函数是最后能取余12多少次 而 12 正好可以分解成 2*2*3 
struct node{
   
	int x;
	int y;
}map[55][55];

//状态数组表示能有多少个2     [2000]表示3的个数  2000个应该就足够大了 
//表示能够有2因子的个数,没有就为-1;
int dp[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值