不知道老师为什么突然要让我们写这个。。。。;
A Longest Run on a Snowboard (滑雪记忆搜)
dp[i][j]表示(i,j)位置的最长滑雪距离;
由于是严格小于的,所以不存在环的情况;
dp[i][j]=max{dp[i’][j’]+1}((i,j)和(i’,j’)相邻且a[i][j]<a[i’][j’]);
不太好确定顺序采用记忆化搜索的方式比较好些一点;
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int N=101; 5 int n,m,mp[N][N],f[N][N]; 6 char s[N]; 7 int dx[4]={1,-1,0,0}; 8 int dy[4]={0,0,1,-1}; 9 int dp(int i,int j){ 10 if(f[i][j])return f[i][j]; 11 f[i][j]=1; 12 for(int k=0;k<4;k++){ 13 int x=i+dx[k],y=j+dy[k]; 14 if(x>=1&&x<=n&&y>=1&&y<=m&&mp[i][j]<mp[x][y])f[i][j]=max(f[i][j],dp(x,y)+1); 15 } 16 return f[i][j]; 17 } 18 int main() 19 { //freopen("A.in","r",stdin); 20 //freopen("A.out","w",stdout); 21 int T; 22 scanf("%d",&T); 23 while(T--){ 24 scanf("%s%d%d",s,&n,&m); 25 for(int i=1;i<=n;i++) 26 for(int j=1;j<=m;j++)scanf("%d",&mp[i][j]),f[i][j]=0; 27 int ans=0; 28 for(int i=1;i<=n;i++) 29 for(int j=1;j<=m;j++)ans=max(ans,dp(i,j)); 30 printf("%s: %d\n",s,ans); 31 } 32 }//by tkys_Austin;