noi 2.6_90滑雪(DP)

Posted konjac蒟蒻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)的主要内容,如果未能解决你的问题,请参考以下文章

noi 2.6_1759最长上升子序列(DP+优化)

noi 2.6_2988计算字符串距离(DP)

noi 2.6_747Divisibility(DP)

noi 2.6_6045开餐馆(DP)

noi 2.6_8464股票买卖(DP)

noi 2.6_3531判断整除(DP)