比较简单的DP,用记忆化搜索比较简单,递推。。。应该不好写吧 。
很容易发现,对于同一个位置,它的最长路是一定的, 不会变的,因为路是递减的,所以该题很适合用记忆化搜索 。 由此我们也可以发现DP和搜索的联系 。
代码如下:
#include<bits/stdc++.h> using namespace std; int T,r,c,a[105][105],d[105][105]; int dx[] = {0,1,0,-1}; int dy[] = {1,0,-1,0}; char name[1000]; int dp(int i,int j) { int& ans = d[i][j]; if(ans >= 0) return ans; ans = 1; for(int k=0;k<4;k++) { int u = i+dx[k]; int v = j+dy[k]; if(u<1||u>r||v<1||v>c) continue; if(a[u][v]<a[i][j]) ans = max(ans,dp(u,v)+1); } return ans; } int main() { scanf("%d",&T); while(T--) { scanf("%s%d%d",name,&r,&c); memset(d,-1,sizeof(d)); for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) scanf("%d",&a[i][j]); int ans = 0; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) ans = max(ans,dp(i,j)); printf("%s: %d\n",name,ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
10285 - Longest Run on a Snowboard(DP)
原文:http://blog.csdn.net/weizhuwyzc000/article/details/46932371