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<algorithm>
11 #define mod=1e9+7;
12 using namespace std;
13
14 typedef long long LL;
15 const int maxn=105;
16 int g[maxn][maxn],vis[maxn][maxn],d[maxn][maxn];
17 int dir[4][2]={-1,0,1,0,0,-1,0,1};
18 int n,m;
19
20 int dfs(int x,int y){
21     if(d[x][y]) return d[x][y];//如果已经搜过这一点,则直接返回,不用再重复计算
22     int ans=0;
23     for(int i=0;i<4;i++){ //四个 方向搜
24         int nx=x+dir[i][0];
25         int ny=y+dir[i][1];
26         if(nx<1||nx>n||ny<1||ny>m) continue;//越界
27         if(g[x][y]>g[nx][ny])
28         ans=max(ans,1+dfs(nx,ny));
29     }
30
31     if(ans==0) return d[x][y]=1;
32     return d[x][y]=ans;
33 }
34
35 int main(){
36     int ncase,r,c;
37     char s[maxn];
38     scanf("%d",&ncase);
39     while(ncase--){
40         cin>>s;
41         cin>>n>>m;
42
43     for(int i=1;i<=n;i++)
44         for(int j=1;j<=m;j++) cin>>g[i][j];
45
46         memset(d,0,sizeof(d));
47         int tmp=0;
48
49         for(int i=1;i<=n;i++){
50             for(int j=1;j<=m;j++)
51              tmp=max(tmp,dfs(i,j));
52         }
53         printf("%s: %d\n",s,tmp);
54     }
55     return 0;
56 }

唉= =自己又敲一遍= =运行出来是错的,还对照着以前写的

真是挫爆了= =以后就算不会,也要自己敲一敲 加油--- go---go--go

时间: 2025-01-17 06:19:17

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 The Tower of Babylon(记忆化搜索)

Problem C Longest Run on a Snowboard Input: standard input Output: standard output Time Limit: 5 seconds Memory Limit: 32 MB Michael likes snowboarding. That's not very surprising, since snowboarding is really great. The bad thing is that in order to

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 10581 - Partitioning for fun and profit(记忆化搜索+数论)

题目链接:uva 10581 - Partitioning for fun and profit 题目大意:给定m,n,k,将m分解成n份,然后按照每份的个数排定字典序,并且划分时要求ai?1≤ai,然后输出字典序排在k位的划分方法. 解题思路:因为有ai?1≤ai的条件,所以先记忆化搜索处理出组合情况dp[i][j][s]表示第i位为j,并且剩余的未划分数为s的总数为dp[i][j][s],然后就是枚举每一位上的值,判断序列的位置即可. #include <cstdio> #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 11008 Antimatter Ray Clearcutting(DFS + 记忆化搜索)

uva 11008 Antimatter Ray Clearcutting It's year 2465, and you are the Chief Engineer for Glorified Lumberjacks Inc. on planet Trie. There is a number of trees that you need to cut down, and the only weapon you have is a high-powered antimatter ray th

UVa 10651 Pebble Solitaire (DP 卵石游戏 记忆化搜索)

 题意  给你一个长度为12的字符串  由字符'-'和字符'o'组成  其中"-oo"和"oo-"分别可以通过一次转换变为"o--"和"--o"  可以发现每次转换o都少了一个  只需求出给你的字符串做多能转换多少次就行了 令d[s]表示字符串s最多可以转换的次数  若s可以通过一次转换变为字符串t  有d[s]=max(d[s],d[t]+1) #include<iostream> #include<s

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