SSL 1558——科技庄园

Description

由于PFT不是机器人,所以他的体力并不是无限的,他不想摘很多的桃以至体力为0,而白白把桃给Life。同时PFT每次只能摘一棵桃树,摘桃花费时间体力,每棵桃树都可以摘K次(对于同一棵桃每次摘的桃数相同)。每次摘完后都要返回出发点(PFT一次拿不了很多)即Life的所在地(0,0){试验田左上角的桃坐标是(1,1)}。
PFT每秒只能移动一个单位,每移动一个单位耗费体力1(摘取不花费时间和体力,但只限上下左右移动)。

Input

第一行:四个数为N,M,TI,A 分别表示试验田的长和宽,Life给PFT的时间,和PFT的体力。
下面一个N行M列的矩阵桃田。表示每次每棵桃树上能摘的桃数。
接下来N行M列的矩阵,表示每棵桃最多可以采摘的次数K。

Output

一个数:PFT可以获得的最大的桃个数。

Sample Input

4 4 13 20
10 0 0 0
0 0 10 0
0 0 10 0
0 0 0 0
1 0 0 0
0 0 2 0
0 0 4 0
0 0 0 0
【样例解释】
可以摘到1次(1,1)和1次(2,3),体力和时间不满足再摘桃了。

Sample Output

10
Hint

对于M N TI A
10<=30%<=50
10<=100%<=100
对于K
10<=100%<=100
保证结果在longint范围内


因为每摘一次都要回到起点,所以我们在预处理时,就将摘这棵桃树一次耗费的时间求出。
枚举桃树、时间和这棵桃树能摘的次数
状态转移方程:f[j]:=max(f[j],f[j-w[i]*k]+c[i]*k);


代码如下:

var
  a,b:array[1..1000,1..1000] of longint;
  w,c,u,f:array[0..10000]of longint;
  n,m,i,j,k,v,t,p:longint;
function max(x,y:longint):longint;
  begin
    if x>y then exit(x);
    exit(y);
end;
begin
  readln(n,m,t,p);
  k:=0;
  for i:=1 to n do
    for j:=1 to m do
      read(a[i,j]);
  for i:=1 to n do
    for j:=1 to m do
      begin
        read(b[i,j]);
        if a[i,j]>0 then
          begin
            inc(k);
            c[k]:=a[i,j];
            u[k]:=b[i,j];
            w[k]:=(i+j)*2;
          end;
      end;
  v:=k;
  for i:=1 to v do
    for j:=t downto 0 do
      for k:=0 to u[i] do
        if (j>=w[i]*k) then f[j]:=max(f[j],f[j-w[i]*k]+c[i]*k);
  if t>=p then t:=p-1;
  writeln(f[t]);
end.

转载于:https://www.cnblogs.com/Comfortable/p/8412308.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值