逃离地牢
题目描述
小明明又被大威鱼抓住了,大威鱼把小明明关在地牢里,地牢由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[