题意 老鼠在一个小镇吃奶酪 城镇可以看成一个n*n的矩阵 其中每个格子都有一定数量的奶酪mat[i][j] 老鼠从(0,0) 开始吃 而且下个吃的格子里的奶酪必须比上个格子多 老鼠只能水平方向或者垂直方向走 而且每次走的距离不能超过k 求老鼠最多能吃多少奶酪
起点是固定的 比较容易 直接记忆化搜索
令d[i][j]表示以(i,j)为终点的最优解 那么对于所有(i,j)能到达的点(x,y)有 d[i][j]=max(d[i][j],d[x][y]+mat[x][y]) 结果直接输出d[0][0]就行了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 105;
#define xx i+k*x[l]
#define yy j+k*y[l]
int d[N][N], mat[N][N], m, n;
int x[4] = { -1, 1, 0, 0}, y[4] = {0, 0, -1, 1};
int dp (int i, int j)
{
if (d[i][j] > 0) return d[i][j];
d[i][j] = mat[i][j];
for (int k = 1; k <= m; ++k)
for (int l = 0; l <= 4; ++l)
{
if (xx > 0 && xx <= n && yy > 0 && yy <= n && mat[xx][yy] > mat[i][j])
d[i][j] = max (d[i][j], mat[i][j] + dp (xx, yy));
}
return d[i][j];
}
int main()
{
while (scanf ("%d%d", &n, &m), n > 0)
{
memset (d, -1, sizeof (d));
for (int i = 1; i <= n;