问题描述:问你滑雪的最大距离是多少?
解题思路:这道题很明显是一道动态规划的题目,状态转移方程也很明显——f[i][j]=max{f[i±1][j]+1,f[i][j±1}+1,f[i][j]}
关键在于怎么保证最后得到的是最优解?
那么就要用到记忆化搜索了,从一个点出发,到达下一个点,那么长度就+1,那么就必须保证你在当前点的长度是最大的!!所以必须把你在当前点的状态存起来~~
代码实现:
#include <bits/stdc++.h>
using namespace std;
int mp[105][105], f[105][105];
int r, c, Maxl = 0;
int dfs(int x, int y)
{
if(f[x][y] > 1)//如果状态已经改变
return f[x][y];
int l = 0;
//四个方向
if(x >= 0 && y >= 0 && x < r && y < c-1 && mp[x][y] > mp[x][y+1])//右
l = max(l, dfs(x, y+1) + 1);
if(x >= 0 && y >= 0 && x < r-1 && y < c && mp[x][y] > mp[x+1][y])//下
l = max(l, dfs(x+1, y) + 1);
if(x >= 0 && y > 0 && x < r && y < c && mp[x][y] > mp[x][y-1])//左
l = max(l, dfs(x, y-1) + 1);
if(x > 0 && y >= 0 && x < r && y < c && mp[x][y] > mp[x-1][y])//上
l = max(l, dfs(x-1, y) + 1);
f[x][y] = max(f[x][y], l);
return f[x][y];
}
int main()
{
int i, j;
cin >> r >> c;
for(i = 0; i < r; i++)
{
for(j = 0; j < c; j++)
{
cin >> mp[i][j];
f[i][j] = 1;//初始化为1!!
}
}
for(i = 0; i < r; i++)
{
for(j = 0; j < c; j++)
Maxl = max(Maxl, dfs(i, j));//每次更新
}
cout << Maxl;
}