题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078
思路:考虑dp,dp[x][y]表示以(x,y)为起点能得到的最大值,很容易得到动态转移式,因为可以走多个点,所以考虑用搜索,搜索+DP。
注意跑到边界直接BREAK,否则TLE。
res初始化为maze[x][y],因为最差的情况dp[x][y]=maze[x][y]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=105;
int dp[N][N];
int maze[N][N];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int n,k;
void init()
{
memset(dp,0,sizeof(dp));
}
void read()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++) scanf("%d",&maze[i][j]);
}
}
int dfs(int x,int y)
{
if(dp[x][y]) return dp[x][y];
int res=maze[x][y]; //1
for(int i=0;i<4;i++)
{
for(int j=1;j<=k;j++)
{
int tx=x+j*dir[i][0];
int ty=y+j*dir[i][1];
if(tx<0||tx==n||ty<0||ty==n) break;
else if(maze[x][y]<maze[tx][ty]) res=max(res,maze[x][y]+dfs(tx,ty));
}
}
dp[x][y]=res;
return dp[x][y];
}
void print()
{
printf("%d\n",dp[0][0]);
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==-1&&k==-1) break;
init();
read();
dfs(0,0);
print();
}
return 0;
}