题目描述:
描述1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
25题目理解:滑雪,只能向下滑,二维数组每个值代表海拔高度,求能滑的最长路径。
解题思路:
用一个二维数组w[i][j]记录每个坐标的高度。
用一个二维数组a[i][j]记录从w[i][j]出发最长的路径。
dx和dy表示上下左右四个方向。
a[i][j]初值为0;
yon表示判断是否超出边界。
源代码:
#include <iostream>
using namespace std;
int f[102][102],r,c,w[102][102],i,j,a[102][102];
int dp(int,int);
bool yon (int ,int );
int main()
{
cin>>r>>c;
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
cin>>w[i][j];
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
a[i][j]=dp(i,j);
int max=0;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
if(max<a[i][j])
max=a[i][j];
}
}
cout<<max+1<<endl;
return 0;
}
bool yon(int i,int j)
{
return (i>=1&&j>=1&&i<=r&&j<=c);
}
int dp (int i,int j)
{
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
if(f[i][j]>0)
return f[i][j];
for(int k=0;k<4;k++)
{
if(yon(i+dx[k],j+dy[k]))
{
if(w[i][j]<w[i+dx[k]][j+dy[k]])
{
if(f[i][j]<dp(i+dx[k],j+dy[k])+1)
f[i][j]=dp(i+dx[k],j+dy[k])+1;
}
}
}
return f[i][j];
}