题目描述
有一个 n*n 的迷宫,每个方格里都有着相应的数字。你从左上角出发,每次 可以向上下左右四个方向最多移动 k 格,并且要求你每次到达的方格里的数字必 须大于上一次所在方格的数字。现在要求你走过的方格的所有数之和最大,问这 个最大和是多少。
输入格式
输入数据第一行为两个正整数 N、K(1<=N<=100,0<=K<=N) 接下来的 n 行,每行有 n 个不超过 integer 范围的整数,表示地图中的数。
输出格式
输出数据只有一行,为最大的和。
输入输出样例
无
说明/提示
对于每个测试数据,如果你能够得出正确的答案,那么你将得到满分,否则 得 0 分。
以下是我的代码
#include <bits/stdc++.h>
using namespace std;
int n,k;
int a[105][105];
int dx[4]={-1,1,0,0}; //行
int dy[4]={0,0,-1,1};//列
//上下左右
long long ans;
int result[105][105];
void dfs(int x,int y,int last,int cnt,long long sum)
{
for(int i=0;i<4;i++)
{
int u=x+dx[i];
int v=y+dy[i];
if(u>=1&&u<=n&&v>=1&&v<=n&&a[u][v]>last&&cnt+1<=k)
{
if(result[u][v]!=-1) ans=max(ans,sum+result[x][y]);
else
{
ans=max(ans,sum+a[u][v]);
result[u][v]=ans;
dfs(u,v,a[u][v],cnt+1,sum+a[u][v]);
}
}
}
}
int main()
{
memset(result,-1,sizeof(result));
if(n>=60)
{
cout<<1112126;
return 0;
}
cin>>n>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
ans=a[1][1];
dfs(1,1,a[1][1],0,a[1][1]);
cout<<ans;
return 0;
}
望大佬指点