uva10285 Longest Run on a Snowboard(DP)
#include <iostream> #include <cstring> #include <cstdio> using namespace std; string ren; int n,m,t; int a[110][110],dp[110][110]; int d[4][2]={-1,0,0,1,1,0,0,-1}; int DP(int x,int y,int l){ if(dp[x][y]!=-1) return dp[x][y]; int ret=1; for(int i=0;i<4;i++){ int xx=x+d[i][0]; int yy=y+d[i][1]; if(xx<0||yy<0||xx>=n||yy>=m) continue; if(a[xx][yy]<a[x][y]) ret=max(ret,DP(xx,yy,1)+1); } return dp[x][y]=ret; } int main(){ //freopen("10285","r",stdin); cin>>t; for(int ca=1;ca<=t;ca++){ cin>>ren>>n>>m; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>a[i][j]; } } memset(dp,-1,sizeof dp); int ans=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ ans=max(ans,DP(i,j,1)); } } printf("%s: %d\n",ren.c_str(),ans); } return 0; }