tyvj 1004 滑雪 記憶化搜索

 
滑雪

Time Limit: 1 Sec  Memory Limit: 256 MBios

題目鏈接

http://www.tyvj.cn/p/1004

Description

    trs喜歡滑雪。他來到了一個滑雪場,這個滑雪場是一個矩形,爲了簡便,咱們用r行c列的矩陣來表示每塊地形。爲了獲得更快的速度,滑行的路線必須向下傾斜。
    例如樣例中的那個矩形,能夠從某個點滑向上下左右四個相鄰的點之一。例如24-17-16-1,其實25-24-23…3-2-1更長,事實上這是最長的一條。

 

Input

輸入文件

第1行: 兩個數字r,c(1<=r,c<=100),表示矩陣的行列。
第2..r+1行:每行c個數,表示這個矩陣。
ide

Output

輸出文件

僅一行: 輸出1個整數,表示能夠滑行的最大長度。
spa

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

 

題意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

題目鏈接

http://www.tyvj.cn/p/1004

Description

    trs喜歡滑雪。他來到了一個滑雪場,這個滑雪場是一個矩形,爲了簡便,咱們用r行c列的矩陣來表示每塊地形。爲了獲得更快的速度,滑行的路線必須向下傾斜。
    例如樣例中的那個矩形,能夠從某個點滑向上下左右四個相鄰的點之一。例如24-17-16-1,其實25-24-23…3-2-1更長,事實上這是最長的一條。

 

Input

輸入文件

第1行: 兩個數字r,c(1<=r,c<=100),表示矩陣的行列。
第2..r+1行:每行c個數,表示這個矩陣。
it

Output

輸出文件

僅一行: 輸出1個整數,表示能夠滑行的最大長度。
io

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;
}
相關文章
相關標籤/搜索