tyvj 1004 滑雪 记忆化搜索
滑雪
Time Limit: 1 Sec Memory Limit: 256 MB
题目连接
http://www.tyvj.cn/p/1004Description
trs喜欢滑雪。他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形。为了得到更快的速度,滑行的路线必须向下倾斜。
例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。
例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。
Input
输入文件
第1行: 两个数字r,c(1<=r,c<=100),表示矩阵的行列。
第2..r+1行:每行c个数,表示这个矩阵。
Output
输出文件
仅一行: 输出1个整数,表示可以滑行的最大长度。
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
HINT
题意
题解:
啊,记忆化搜索,BFS和DFS随便乱搞都行,注意得把所有点都扔进队列里面~\(≧▽≦)/~啦啦啦
代码:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 2001 #define mod 10007 #define eps 1e-9 //const int inf=0x7fffffff; //无限大 const int inf=0x3f3f3f3f; /* inline ll read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int buf[10]; inline void write(int i) { int p = 0;if(i == 0) p++; else while(i) {buf[p++] = i % 10;i /= 10;} for(int j = p-1; j >=0; j--) putchar('0' + buf[j]); printf("\n"); } */ //************************************************************************************** inline ll read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int g[maxn][maxn]; int dp[maxn][maxn]; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; int main() { int mx=0; int my=0; int ma=0; int n=read(),m=read(); queue<int> qx; queue<int> qy; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { g[i][j]=read(); dp[i][j]=1; qx.push(i); qy.push(j); } } while(!qx.empty()) { int nowx=qx.front(); int nowy=qy.front(); qx.pop(); qy.pop(); for(int i=0;i<4;i++) { int nextx=nowx+dx[i]; int nexty=nowy+dy[i]; if(nextx<1||nextx>n||nexty<1||nexty>m) continue; if(g[nextx][nexty]<g[nowx][nowy]) { if(dp[nowx][nowy]>=dp[nextx][nexty]) { dp[nextx][nexty]=dp[nowx][nowy]+1; qx.push(nextx); qy.push(nexty); } } } } int ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { ans=max(dp[i][j],ans); } } cout<<ans<<endl; }