Mooo Moo(dp)

题意:

FJ 已经完全忘记了他有多少头奶牛!但是,跑到他的草场里数奶牛是一件很尴尬的事情,因为他不想让奶牛们知道他记忆有问题。作为替代,他决定秘密地把麦克风种在奶牛们通常聚集的草场里,然后只要从他听到的哞哞声音量中确定奶牛的数目即可。
FJ 的N 块草场(1 <= N <= 100)沿着一条笔直的路排成了一排。每块草场里可能有若干种不同的奶牛;FJ 的奶牛总共有B 种不同的种类(1 <= B <= 20),并且种类i 的一头奶牛叫起来的音量为V (i)(1 <= V (i) <= 100)。再者,沿着道路有一股强悍的风在吹,将哞哞叫的声音从路的左边传到右边:如果在某草场哞哞叫声音量为X,那么在下一个草场里会听到上边X -1 音量的叫声(并且在再下一个草场是X -2,等等)。更正式地说,一个草场的哞哞叫总音量为这个草场里奶牛哞哞的音量之和,加上X -1,这里X 是上一个草场的哞哞叫总音量。
给定FJ 从每个草场里记录的哞哞音量,请帮助他计算出他所拥有的奶牛的可能的最少数量。
任何一个草地上记录的音量值不超过100,000

思路:

设一个f,f[i]有i的声音的最少奶牛数。
f[i]=max(f[i-a[j]]+1)

源程序:

const
 maxn=1000000;
var
 i,j,n,m,x,y:longint;
 ans:int64;
 f,a:array [0..maxn] of longint;

function max(x,y:longint):longint;
begin
 if x<y then exit(y)
        else exit(x);
end;

function min(x,y:longint):longint;
begin
 if x<y then exit(x)
        else exit(y);
end;


begin
 readln(n,m);
 for i:=1 to m do
  readln(a[i]);
 fillchar(f,sizeof(f),$7f);
 f[0]:=0;
 for i:=1 to 100000 do
  for j:=1 to m do
   if a[j]<=i then
   f[i]:=min(f[i],f[i-a[j]]+1);

 for i:=1 to n do
 begin
  readln(x);
  ans:=ans+f[x-y];
  y:=max(0,x-1);
 end;
 writeln(ans);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值