UVA - 10285 Longest Run on a Snowboard --DAG最长路

问题

给一个m*n(m,n<=100)矩阵,要求找到矩阵中的最长递减路径长度(从一个元素出发,可以往四个方向走,但是数字的值必须减少)

分析

DAG(有向无环图)最长路问题
填表法,记忆化搜索

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=105;
int dp[maxn][maxn],T,R,C,num[maxn][maxn];
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
string s;

int DP(int i,int j){
    int &ans=dp[i][j];
    if(dp[i][j]>0) return ans;
    ans=1;
    for(int k=0;k<4;++k){
        int ni=i+dx[k],nj=j+dy[k];
        if(ni>=0 && ni<R && nj>=0 && nj<C && num[ni][nj]<num[i][j]){
            ans=max(ans,DP(ni,nj)+1);
        }
    }
    return ans;
}

int main(void){
    cin>>T;
    for(int kase=1;kase<=T;++kase){
        cin>>s>>R>>C;
        for(int i=0;i<R;++i){
            for(int j=0;j<C;++j){
                scanf("%d",&num[i][j]);
            }
        }
        memset(dp,0,sizeof(dp));
        int ans=1;
        for(int i=0;i<R;++i){
            for(int j=0;j<C;++j){
                ans=max(ans,DP(i,j));
            }
        }
        cout<<s<<": "<<ans<<endl;
    }
    return 0;
}



发布了15 篇原创文章 · 获赞 0 · 访问量 161

猜你喜欢

转载自blog.csdn.net/zpf1998/article/details/104069256