jzoj 1579. 【普及模拟】老鼠 解题报告

题目描述
   最近小h家闹鼠灾,弄得小h十分恼火。为了解决老鼠的问题,小h根据老鼠的特点想出了一个方法。假设小h 的家是一个n*n的格子,每个格子都有一定的食物,数量在0到100之间,经过观察,老鼠的窝在(1,1)的位置,老鼠吃东西有个特点,到哪个地方,就把这个地方的食物都吃掉,而且每次都比上一次吃的食物要多,因此它们总会有个停止的地方,而且,这些老鼠一次最多可以跳k格,不过只能按x轴或y轴方向来跳。现在,小h给出食物的分布,他想知道一只老鼠最多可以吃到多少食物。
输入
第一行,n,(1<=n<=100),k,(0<=k<=n),表示n*n的格子,老鼠一次最多跳k格。

   接下来的n行,每行n个数,表示这个方格上的食物数量。
输出
一个数,表示一只老鼠最多可以吃到的食物。
样例输入
3 1

1 2 5

10 11 6

12 12 7

样例输出
37

数据范围限制
提示
【样例解释】

(1,1)->(1,2)->(1,3)->(2,3)->(2,2)->(3,2)

1+2+5+6+11+12=37

 代码如下: 记忆化搜索
const
 wx:array[1..4]of longint=(1,0,-1,0);
 wy:array[1..4]of longint=(0,1,0,-1);
var
 a,f:array[-100..1001,-100..1001]of longint;
 n,k,max:longint;

procedure dfs(x,y:longint);
var i,j:longint;
begin
 for i:=1 to 4 do
  for j:=1 to k do
   if (a[x,y]<a[x+wx[i]*j,y+wy[i]*j])and(x+wx[i]*j>0)and(x+wx[i]*j<=n)and(y+wy[i]*j>0)and(y+wy[i]*j<=n) then
     if  f[x+wx[i]*j,y+wy[i]*j]<f[x,y]+a[x+wx[i]*j,y+wy[i]*j] then
   begin
    f[x+wx[i]*j,y+wy[i]*j]:=f[x,y]+a[x+wx[i]*j,y+wy[i]*j];
    dfs(x+wx[i]*j,y+wy[i]*j);
   end;
end;

procedure init;
var i,j:longint;
begin
 readln(n,k);
 for i:=1 to n do
  for j:=1 to n do
   read(a[i,j]);
  f[1,1]:=a[1,1];
end;

procedure print;
var i,j:longint;
begin
 for i:=1 to n do
  for j:=1 to n do
   if f[i,j]>max then max:=f[i,j];
  write(max);
end;

begin
 assign(input,'mouse.in'); reset(input);
 assign(output,'mouse.out');rewrite(output);
 init;
 dfs(1,1);
 print; 
end.


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值