不知道老师为什么突然要让我们写这个。。。。;


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; 
View Code

相关文章:

  • 2021-08-18
  • 2021-09-24
  • 2021-12-21
  • 2021-12-31
  • 2022-12-23
  • 2021-05-26
  • 2021-07-24
猜你喜欢
  • 2022-12-23
  • 2021-08-17
  • 2022-03-10
  • 2022-01-04
  • 2021-06-17
相关资源
相似解决方案