#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,k;
int graph[105][105];
int dp[105][105];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
bool vis[105][105];
int ans = 0;
//void dfs(int x,int y,int level,int sum){
// if(sum > ans)
// ans = sum;
// for(int i=0;i<4;i++){
// int xx = x+dx[i];
// int yy = y+dy[i];
// if(xx>=0 && yy>=0 && xx<n && yy<n && graph[xx][yy] > graph[x][y]){
// if(!vis[xx][yy]){
// vis[xx][yy] = true;
// dfs(xx,yy,level+1,sum+graph[xx][yy]);
// vis[xx][yy] = false;
// }
// }
// }
// return ;
//}
int dfs(int x,int y){
if(dp[x][y])
return dp[x][y];
int cnt = 0;
for(int i=0;i<4;i++){
for(int j=1;j<=k;j++){ //向相同的方向走k步
int xx = x+dx[i]*j;
int yy = y+dy[i]*j;
if(xx<0 || xx>=n || yy<0 || yy>=n)
break;
if(graph[xx][yy] > graph[x][y]){ //下一步的数量是否比当前位置的多
cnt = max(cnt,dfs(xx,yy));
}
}
}
return dp[x][y] = graph[x][y] + cnt;
}
int main(){
while(1){
scanf("%d%d",&n,&k);
memset(vis,false,sizeof(vis));
memset(dp,0,sizeof(dp));
ans = 0;
if(n==-1 && k==-1)
break;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&graph[i][j]);
}
}
//vis[0][0] = true;
//dfs(0,0,0,graph[0][0]);
printf("%d\n",dfs(0,0));
}
return 0;
}
HDU 1078 记忆化dfs
猜你喜欢
转载自blog.csdn.net/weixin_42246923/article/details/80759936
今日推荐
周排行