uva10285

简单的dfs加dp,搜索每个点的上下左右,然后寻找到每个点的最大长度,这里要注意的是每条路径的起始点和终点不同,所以每个最终点都要找一下最终长度,寻找最大的最终长度。

#include <bits/stdc++.h>

using namespace std;
const int maxn=10000;
string s;
int n,r,c;
int num[maxn][maxn],d[maxn][maxn];
int dp(int u,int v)
{
    if(d[u][v]) return d[u][v];
    d[u][v]=1;
    if(u-1>0&&num[u-1][v]<num[u][v]) d[u][v]=max(d[u][v],dp(u-1,v)+1);
    if(u+1<=r&&num[u+1][v]<num[u][v]) d[u][v]=max(d[u][v],dp(u+1,v)+1);
    if(v-1>0&&num[u][v-1]<num[u][v]) d[u][v]=max(dp(u,v-1)+1,d[u][v]);
    if(v+1<=c&&num[u][v+1]<num[u][v]) d[u][v]=max(dp(u,v+1)+1,d[u][v]);
    return d[u][v];

}
int main()
{   int t;
    cin >> t;
    getchar();
    while(t--)
    {   cin >> s >> r >> c;
        memset(d,0,sizeof(d));
        memset(num,0,sizeof(num));
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)
            cin >> num[i][j];
        int maxi=1;
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)
            maxi=max(maxi,dp(i,j));
        cout << s << ": " << maxi <<endl;

    }
    return 0;
}

 

posted on 2017-02-25 09:49  发牌员  阅读(212)  评论(0)    收藏  举报

导航