UVa 10285 Longest Run on a Snowboard

这题我的第一感觉就是用DFS。自己写的貌似不够完美,因为我看见别人的时间都特别的短,而我的有点长。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
const int N=102;
int height[N][N];
bool visited[N][N];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int m,n,m_len;
bool judge(int x,int y)
{
    if(visited[x][y])
        return false;
    return (x>=1&&x<=n)&&(y>=1&&y<=m);
}
bool isdec(int x,int y)
{
    for(int i=0;i<4;i++)
    {
        int a=x+dx[i];
        int b=y+dy[i];
        if(judge(a,b)&&height[a][b]<height[x][y])
            return true;
    }
    return false;
}
void dfs(int x,int y,int len)
{
    if(!isdec(x,y))
    {
        if(m_len<len)
            m_len=len;
        return;
    }
    for(int i=0;i<4;i++)
    {
        int a=x+dx[i];
        int b=y+dy[i];
        if(height[a][b]>=height[x][y])
            continue;
        if(judge(a,b))
        {
            visited[a][b]=true;
            dfs(a,b,len+1);
            visited[a][b]=false;
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        char s[40];
        scanf("%s%d%d",s,&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            scanf("%d",&height[i][j]);
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                memset(visited,false,sizeof(visited));
                m_len=0;
                dfs(i,j,1);
                if(ans<m_len)
                    ans=m_len;
            }
        }
        printf("%s: %d\n",s,ans);
    }
    return 0;
}
时间: 2024-10-14 11:53:56

UVa 10285 Longest Run on a Snowboard的相关文章

uva 10285 Longest Run on a Snowboard (记忆化搜索)

uva 10285 Longest Run on a Snowboard 题目大意:给出一张n*m的雪地地图,每格标注的是该点的高度.从地势高的地方可以滑到地势低的地方(只能上下左右滑),问最长的滑雪距离. 解题思路:逐一访问各点,若该点没有被访问过,则进行DFS找出该点为滑雪起始点的最长滑雪距离,用dp数组记录,若该点已被访问过,则返回其对应的dp数组记录的值. #include <cstdio> #include <cstring> #include <algorithm

UVa 10285 Longest Run on a Snowboard(DP 二维最长递减子序列)

题意  输入一个城市的滑雪地图  你可以从高的地方滑到伤下左右低的地方  求这个城市的最长滑雪线路长度   即在一个矩阵中找出最长递减连续序列 令d[i][j]为以格子map(i,j)为起点的最长序列   则有状态转移方程d[i][j]=max{d[a][b]}+1  a,b为与i,j相邻且值比i,j小的所有点 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #def

UVa 10285 Longest Run on a Snowboard【记忆化搜索】

题意:和最长滑雪路径一样, 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algori

10285 - Longest Run on a Snowboard(DP)

比较简单的DP,用记忆化搜索比较简单,递推...应该不好写吧 . 很容易发现,对于同一个位置,它的最长路是一定的, 不会变的,因为路是递减的,所以该题很适合用记忆化搜索 .  由此我们也可以发现DP和搜索的联系 . 代码如下: #include<bits/stdc++.h> using namespace std; int T,r,c,a[105][105],d[105][105]; int dx[] = {0,1,0,-1}; int dy[] = {1,0,-1,0}; char name

【UVA】10285-Longest Run on a Snowboard(动态规划)

这题出简单了,不需要打印路径. 状态方程dp[i][j] = max(dp[i-1][j],dp[i][j-1],dp[i+1][j],dp[i][j+1]); 14003395 10285 Longest Run on a Snowboard Accepted C++ 0.026 2014-08-07 11:43:51 枚举每个点进行遍历,使用记忆化搜索.要不会超时. #include<cstdio> #include<cstring> #include<iostream&

uva10285 Longest Run on a Snowboard(dp之记忆化搜索 )

10285 Longest Run on a Snowboard Michael likes snowboarding. That's not very surprising, since snowboarding is really great. The bad thing is that in order to gain speed, the area must slide downwards. Another disadvantage is that when you've reached

uva10285 - Longest Run on a Snowboard(记忆化搜索)

题目:uva10285 - Longest Run on a Snowboard(记忆化搜索) 题目大意:给出N * N的矩阵,要求找到一条路径,路径上的值是递减的,求这样的路径的最长长度. 解题思路:记忆话搜索.因为要求最长的路径那么就需要将所有的这样的路径找出,但是直接dfs会超时的.对于同一个位置,从这个点出发的最长路径长度是固定的.所以在找的时候就要将这个位置的最长路径算出来并且保存下来.一开始还担心会走回头路就是一直兜圈子.但是后面发现能往右走就不可能在从右边的那个位置走回去,因为路径

Longest Run on a Snowboard

题意: n*m的矩阵,求矩阵中最长下降的序列的长度. 分析: dp[i][j]表示以i,j为起点的最长下降序列,然后记忆化搜索. #include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include

UVA-10285 Longest Run on a Snowboard (递推)

题目大意:滑雪.给一个二维数组,找出最长的连续下降序列的长度. 题目分析:定义dp(i,j)表示以a[i][j]结尾的最长连续下降序列的长度,则dp(i,j)=max(dp(i-1,j),dp(i+1,j),dp(i,j-1),dp(i,j+1)),重复这个DP过程滚动更新dp数组100次即可(我专门做了一下测试,更新次数在42次及以上时都能AC). 代码如下: # include<iostream> # include<cstdio> # include<string>