Time Limit: 1 Sec Memory Limit: 256 MBios
輸入文件
第1行: 兩個數字r,c(1<=r,c<=100),表示矩陣的行列。
第2..r+1行:每行c個數,表示這個矩陣。ide
輸出文件
僅一行: 輸出1個整數,表示能夠滑行的最大長度。spa
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隊列
題意ip
題解:ci
啊,記憶化搜索,BFS和DFS隨便亂搞都行,注意得把全部點都扔進隊列裏面代碼:get
//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; }
Time Limit: 1 Sec Memory Limit: 256 MBstring
輸入文件
第1行: 兩個數字r,c(1<=r,c<=100),表示矩陣的行列。
第2..r+1行:每行c個數,表示這個矩陣。it
輸出文件
僅一行: 輸出1個整數,表示能夠滑行的最大長度。io
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
題意
題解:
啊,記憶化搜索,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; }