题目意思是一个胖老鼠要在一个n*n大小的棋盘里吃奶酪,这个老鼠每一步最多能走k单位远,而且每走一步,必须走到比当前点奶酪数多的点那去。告诉你这个棋盘里每个点上的奶酪个数,求这个老鼠最多能吃多少奶酪。这里用记忆化的方法写,将已经计算的结果保存起来,数组超了好久,晕。OK Its My Time。
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[105][105];
int dp[105][105];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool check(int x,int y){
if(x<0||y<0||x>=n||y>=n){
return false;
}
return true;
}
int dfs(int x,int y){
int ans=0;
if(dp[x][y])return dp[x][y];
for(int i=0;i<4;i++){
for(int j=1;j<=k;j++){
int tx=x+dir[i][0]*j;
int ty=y+dir[i][1]*j;
if(check(tx,ty)&&a[tx][ty]>a[x][y]){
ans=max(ans,dfs(tx,ty));
}
}
}
dp[x][y]=ans+a[x][y];
return dp[x][y];
}
int main(){
ios::sync_with_stdio(false);
while(cin>>n>>k){
if(n==-1&&k==-1)break;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
memset(dp,0,sizeof(dp));
cout<<dfs(0,0)<<endl;
}
return 0;
}