【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 }