先来DP的代码O(∩_∩)O~
/*自顶向下的分析,自底向上的求解*/
#include<stdio.h>
int n,k;
int map[101][101],dp[101][101];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int DFS(int x,int y)
{
int i,j,nx,ny,t,max=0;
if(dp[x][y]!=0) //记忆化
return dp[x][y];
for(i=1;i<=k;i++) //每次最多可以走k步,可以不是连续k步都在一条直线上的(perfect)
for(j=0;j<4;j++) //依次算出4个方向上能吃到的符合条件的奶酪数量
{
nx=x+i*dir[j][0];
ny=y+i*dir[j][1];
if(nx>=0 && nx<n && ny>=0 && ny<n && map[nx][ny]>map[x][y]) //后面吃到的奶酪一定要比之前吃到的多
{
t=DFS(nx,ny); //递归调用
if(max<t) //记录该点4个方向上能吃到的奶酪的数量的最大值(符合条件的)
max=t;
}
}
dp[x][y]=max+map[x][y]; //从“理想”终点到该点所能吃到的最多的奶酪数量
return dp[x][y];
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&k)!=EOF&&(n!=-1||k!=-1))
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
scanf("%d",&map[i][j]);
dp[i][j]=0;
}
DFS(0,0);
printf("%d/n",dp[0][0]);
}
return 0;
}
再来非DP的
#include<stdio.h>
int n,k,max;
int map[101][101],r[101][101];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int x,int y,int s)
{
int i,j,nx,ny;
if(s>r[x][y])
r[x][y]=s;
if(s>max)
max=s;
for(i=1;i<=k;i++)
for(j=0;j<4;j++)
{
nx=x+i*dir[j][0];
ny=y+i*dir[j][1];
if(nx>=0 && nx<n && ny>=0 && ny<n && map[nx][ny]>map[x][y])
{
if(r[nx][ny]!=-1 && s+map[nx][ny]<=r[nx][ny])
continue;
dfs(nx,ny,s+map[nx][ny]);
}
}
return;
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==-1 && k==-1)
break;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
scanf("%d",&map[i][j]);
r[i][j]=-1;
}
max=-1;
dfs(0,0,map[0][0]);
printf("%d/n",max);
}
return 0;
}