题目描述:
如图所示,其中图上的每个点都会有一个体力消耗值。从 0,0,0 到 x,y,z 的最少消耗的体力是多少?
题解:
我们用f[i[j][k]来表示蒜头君当前所在位置,我们可以知道蒜头君是一步到达这个位置的。 我们可以知道蒜头君每次移动只会更改i,j,k的一个值。这个时候我们就可以知道当前位置会来自f[i-1][i][k],f[i][j- 1][k],f[i][j][k- 1]这三个位置。
所以我们我们只需要找到前三个状态的最小值,然后在加上当前位置消耗的体力值。就是蒜头君到达当前位置需要消耗体大的最小值。
最终我们可以得到下面的递推式:
f[i][i][k] = min(f[i-1][j][k],f[i][j-1][k], f[i][j][k-1]) + f[i][i][k]
#include <iostream>
using namespace std;
const int N = 1e2 + 9;
const int inf = 1000000000;
int f[N][N][N];
int main() {
int x, y, z;
cin >> x >> y >> z;
for (int i = 0; i <= x; i++)
{
for (int j = 0; j <= y; j++)
{
for (int k = 0; k <= z; k++)
{
cin >> f[i][j][k];
}
}
}
for (int i = 0; i <= x; i++)
{
for (int j = 0; j <= y; j++)
{
for (int k = 0; k <= z; k++)
{
int mi = inf;
if (i != 0)
{
mi = min(mi, f[i - 1][j][k]);
}
if (j != 0)
{
mi = min(mi, f[i][j - 1][k]);
}
if (k != 0)
{
mi = min(mi, f[i][j][k - 1]);
}
if (mi != inf)
{
f[i][j][k] += mi;
}
}
}
}
cout << f[x][y][z] << endl;
return 0;
}