话说DP=记忆化搜索这句话真不是虚的。
面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦!
通过对四个方向进行搜索,即可得到当前状态的最优解。
#include <iostream> #include <cstdio> using namespace std; int date[105][105]; int dp[105][105]; int dir[][2]= {{0,1},{0,-1},{1,0},{-1,0}}; int r,c; int dpac(int i,int j) { if (dp[i][j]>1) return dp[i][j]; for (int k=0; k<4; k++) { int nr=i+dir[k][0]; int nc=j+dir[k][1]; if (nr<1||nc<1||nr>r||nc>c) continue; if (date[i][j]>date[nr][nc]) { dp[nr][nc]=dpac(nr,nc); dp[i][j]=max(dp[nr][nc]+1,dp[i][j]); } } return dp[i][j]; } int main() { while (scanf("%d %d",&r,&c)!=EOF) { int i,j,k,p; for (i=1; i<=r; i++) { for (j=1; j<=c; j++) { scanf("%d",&date[i][j]); dp[i][j]=1; } } int ans=0; for (i=1; i<=r; i++) { for (j=1; j<=c; j++) { int temp=dpac(i,j); if (ans<temp) ans=temp; } } printf("%d ",ans); } return 0; }