N X N 的矩阵中, 一直老鼠每次最多可以走K步,走到的位置只能比前一个位置大,并且获得那里的价值,
问最大价值是多少;
在dfs中额外加一个判定就可以了,
然后每一步都取最大值就可以了
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int n,k,dp[155][155],a[155][155]; int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; int check(int x,int y) { if(x<1 || y<1 || x>n || y>n) return 1; return 0; } int dfs(int x,int y) { int i,j,l,ans = 0; if(!dp[x][y]) { for(i = 1; i<=k; i++) { for(j = 0; j<4; j++) { int nx = x+dir[j][0]*i; int ny = y+dir[j][1]*i; if(check(nx,ny)) continue; if(a[nx][ny]>a[x][y]) ans = max(ans,dfs(nx,ny)); } } dp[x][y] = ans+a[x][y]; } return dp[x][y]; } int main() { int i,j; while(~scanf("%d%d",&n,&k),n>0&&k>0) { for(i = 1; i<=n; i++) for(j = 1; j<=n; j++) scanf("%d",&a[i][j]); memset(dp,0,sizeof(dp)); printf("%d\n",dfs(1,1)); } return 0; }