题目:http://hihocoder.com/problemset/problem/1037
- 一个迷宫有n层,第 i 层有 i 个房间
- 从第i层的第i个房间(i, i)可以走到第i+1层的第i个房间或第i+1房间(i+1, i)/(i+1, i+1)
- 每个房间走出去后都不能回头
样例输入
5 //迷宫的层数
2
6 4
1 2 8
4 0 9 6
6 5 5 3 6
结果: 28
思路
动态规划
maze[i, j] = max(maze[i-1, j], maze[i-1, j-1]) 源码
- 迭代方式,从下而上
#include <iostream>
using namespace std; static int maze[][];//存储到达每一个房间收集到的最多券
static int data[][];//存储每一个房间的券 int main()
{
int maxLevel, i = , max = ;
cin >> maxLevel; for (i = ; i < maxLevel; i++)
for (int j = ; j <= i; j++)
cin >> data[i][j];
//由低层到高层计算
maze[][] = data[][];
for (int i = ; i < maxLevel; i++)
{
for (int j = ; j <= i; j++)
{
if (j > && maze[i - ][j] < maze[i - ][j - ])
maze[i][j] = maze[i - ][j - ];
else
maze[i][j] = maze[i - ][j];
maze[i][j] += data[i][j];
}
}
//找出最后一层中券最多的房间
for (i = ; i < maxLevel; i++)
{
int tmp = maxLevel - ;
if (max < maze[tmp][i])
max = maze[tmp][i];
}
cout << max << endl;
return ;
}
- 递归方式,从上而下
#include <iostream>
using namespace std; int maze[][];
int data[][];
void dp(int level)
{
if (level < )
return;
dp(level - );
for (int room = ; room <= level; room++)
{
if (level > )
{
if (room > )
maze[level][room] = maze[level - ][room] > maze[level - ][room - ] ? maze[level - ][room] : maze[level - ][room - ];
else
maze[level][room] = maze[level - ][room];
}
else
maze[level][room] = ;
maze[level][room] += data[level][room];
}
}
int main()
{
int maxLevel, i = , max = ;
cin >> maxLevel; for (i = ; i < maxLevel; i++)
for (int j = ; j <= i; j++)
cin >> data[i][j];
dp(maxLevel - );
for (i = ; i < maxLevel; i++)
{
int tmp = maxLevel - ;
if (max < maze[tmp][i])
max = maze[tmp][i];
}
cout << max << endl;
return ;
}