题意:可以向任何方向最多走k步,求最大价值。
代码如下:
#include<stdio.h>
#include<string.h>
#define MAX 110
#define Min(a,b) a<b?a:b
#define Max(a,b) a>b?a:b
int n,k;
int map[MAX][MAX];
int dp[MAX][MAX];
int to[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 0;
return 1;
}
int dfs(int x,int y){
int i,j,ans=0;
int xx,yy;
if(!dp[x][y]){
for(i=1;i<=k;i++)
for(j=0;j<4;j++){
xx=x+to[j][0]*i;
yy=y+to[j][1]*i;
if(!check(xx,yy))continue;
if(map[xx][yy]>map[x][y])ans=Max(ans,dfs(xx,yy));
}
dp[x][y]=ans+map[x][y];
}
return dp[x][y];
}
int main(){
int i,j;
while(~scanf("%d%d",&n,&k)){
memset(dp,0,sizeof(dp));
if(n==-1&&k==-1)break;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
printf("%d\n",dfs(1,1));
}
return 0;
}
本文介绍了一个使用深度优先搜索(DFS)算法解决特定问题的方法:在一个矩阵中找到从起点出发,最多行走k步的最大价值路径。代码实现考虑了边界条件,并通过递归方式遍历所有可能的方向。
620

被折叠的 条评论
为什么被折叠?



