首页 > 代码库 > 【noi 2.6_90】滑雪(DP)

【noi 2.6_90】滑雪(DP)

题意:输出最长下降路径的长度。

解法:f[i][j]表示结尾于(i,j)的最长的长度。由于无法确定4个方位已修改到最佳,所以用递归实现。

 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 #define Maxn 110 7  8 int a[Maxn][Maxn],f[Maxn][Maxn]; 9 int n,m;10 11 int ffind(int i,int j)12 {13     if (!i || !j || i>n || j>m) return 0;14     if (!f[i][j])15     {16       int x=1;17       if (a[i][j]<a[i-1][j]) x=max(x,ffind(i-1,j)+1);18       if (a[i][j]<a[i][j-1]) x=max(x,ffind(i,j-1)+1);19       if (a[i][j]<a[i+1][j]) x=max(x,ffind(i+1,j)+1);20       if (a[i][j]<a[i][j+1]) x=max(x,ffind(i,j+1)+1);21       f[i][j]=x;22     }23     return f[i][j];24 }25 int main()26 {27     scanf("%d%d",&n,&m);28     for (int i=1;i<=n;i++)29      for (int j=1;j<=m;j++)30        scanf("%d",&a[i][j]);31     memset(f,0,sizeof(f));32     int ans=0;33     for (int i=1;i<=n;i++)34      for (int j=1;j<=m;j++)35      {36        f[i][j]=ffind(i,j);37        ans=max(ans,f[i][j]);38      }39     printf("%d\n",ans);40     return 0;41 }

 

【noi 2.6_90】滑雪(DP)