您的位置:首页 > 其它

动态规划NM---滑雪问题

2015-04-14 00:02 162 查看
滑雪问题:

高--->低,求滑行最长距离

input:第一行表示区域的行数R和列数C(1<=R,C<=100),R行C个数,代表高度h,0<=h<=10000;

output:求出最长区域的长度;

sample input:

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

sample output:

25

代码:

#include <iostream>
#include <cstring>
int a[101][101];
int b[101][101];
int m,n;
using namespace std;
int f(int x,int y)
{
int max1,max2;
int right=0,left=0,up=0,down=0;
if(b[x][y]>0)
return b[x][y];
if(x-1>0&&a[x][y]>a[x-1][y])
up=f(x-1,y);//上
if(x+1<=n&&a[x][y]>a[x+1][y])
down=f(x+1,y);//下
if(y-1>0&&a[x][y]>a[x][y-1])
left=f(x,y-1);//左
if(y+1<=m&&a[x][y]>a[x][y+1])
right=f(x,y+1);//右
max1=max(right,left);
max2=max(up,down);
b[x][y]=max(max1,max2)+1;
return b[x][y];

}
int main()
{
int i,j,k,maxb=0;
memset(b,0,sizeof(b));
while(cin>>m>>n)
{
maxb=0;
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
cin>>a[i][j];
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
k=f(i,j);
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
if(b[i][j]>maxb)
maxb=b[i][j];
cout<<maxb<<endl;
}

return 0;
}


小结:

算法:递归-深度搜索-动态规划;

这道题类似于走迷宫类型题目,只是不定起点,但复杂度基本没有改变。类迷宫题的思路首先会想到采用动态规划打表,还不是很熟,细节的处理还要考虑半天。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: