UVA10285 Longest Run on a Snowboard

题解:

记忆化搜索入门题

代码:

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define se second
#define fs first
#define LL long long
#define CLR(x) memset(x,0,sizeof x)
#define MC(x,y) memcpy(x,y,sizeof(x))
#define SZ(x) ((int)(x).size())
#define FOR(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef pair<int,int> P;
const double eps=1e-9;
const int maxn=200100;
const int mod=1e9+7;
const int INF=1e9;

int M[110][110];
int dp[110][110];
char name[50];
int r,c;

int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};

int DP(int x,int y)
{
    int &m=dp[x][y];
    if(m) return m;
    m=1;
    for(int i=0;i<4;i++)
    {
        int a=x+dx[i];
        int b=y+dy[i];
        if(a>0&&a<=r&&b>0&&b<=c&&M[a][b]<M[x][y]) m=max(DP(a,b)+1,m);
    }
    return m;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(dp,0,sizeof(dp));
        scanf("%s %d %d",name,&r,&c);
        for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++) scanf("%d",&M[i][j]);
        int Max=1;
        for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++) Max=max(Max,DP(i,j));
        printf("%s: %d\n",name,Max);
    }
    return 0;
}
时间: 2024-08-02 11:00:50

UVA10285 Longest Run on a Snowboard的相关文章

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

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

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

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>

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

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

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

这题我的第一感觉就是用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 vi

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