题目大意:给你一个二维数组,找到一个最长递减子序列的长度,某一点可以向上下左右四个方向移动.
分析:典型的动态规划题(错了好多次,也看了大神的代码);方法:dfs搜素+备忘录
http://vjudge.net/problem/viewProblem.action?id=16378
源代码:
/**
*dfs+dp
*/
#include<iostream>
#include<cstring>
using namespace std;
int a[101][101],dp[101][101],c,r;
int dfs(int i,int j){
if(dp[i][j]) return dp[i][j];//已访问,直接返回
int k=1;
if(i-1>=1&&a[i][j]>a[i-1][j]) k=max(dfs(i-1,j)+1,k);
if(i+1<=c&&a[i][j]>a[i+1][j]) k=max(dfs(i+1,j)+1,k);
if(j-1>=1&&a[i][j]>a[i][j-1]) k=max(dfs(i,j-1)+1,k);
if(j+1<=r&&a[i][j]>a[i][j+1]) k=max(dfs(i,j+1)+1,k);
return dp[i][j]=k;
}
int main()
{
while(cin>>c>>r){
for(int i=1;i<=c;i++){
for(int j=1;j<=r;j++){
cin>>a[i][j];
}
}
memset(dp,0,sizeof(dp));
int max=0;
for(int i=1;i<=c;i++){
for(int j=1;j<=r;j++){
if(max<dfs(i,j)) max=dfs(i,j);
}
}
cout<<max<<endl;
}
return 0;
}