【USACO】贝茜的晨练计划

来源:互联网 发布:软件测试项目描述 编辑:程序博客网 时间:2024/04/25 08:59

【USACO】贝茜的晨练计划

题目:

奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行N(1 <= N <= 10,000)分钟的晨跑。


在每分钟的开始,贝茜会选择下一分钟是用来跑步还是休息。贝茜的体力限制了她跑步的距离。更具体地,如果贝茜选择在第i分钟内跑步,她可以在这一分钟内跑D_i(1 <= D_i <= 1,000)米,并且她的疲劳度会增加1。不过,无论何时贝茜的疲劳度都不能超过M(1 <= M <= 500)。如果贝茜选择休息,那么她的疲劳度就会每分钟减少1,但她必须休息到疲劳度恢复到0为止。在疲劳度为0时休息的话,疲劳度不会再变动。晨跑开始时,贝茜的疲劳度为0。还有,在N分钟的锻炼结束时,贝茜的疲劳度也必须恢复到0,否则她将没有足够的精力来对付这一整天中剩下的事情。


请你计算一下,贝茜最多能跑多少米。


输入:

1: 2个用空格隔开的整数: M


2..N+1i+11个整数:D_i


输出:
输出1个整数,表示在满足所有限制条件的情况下,贝茜能跑的最大距离。


比赛时神速想到DP
A了样例后就没理了
(一般DP题我都不抱有什么希望)
没想到分数下来
AC!!!
我和我的小伙伴们都惊呆了...

我们用f[i,j]表示奶牛跑了i分钟,疲劳值为j所能跑到的最远距离
如果j=0那么往前找
把f[i,j]赋值为f[i-k,k](设k表示休息了k分钟)
j!=0的话
f[i,j]=max(f[i,j],f[i-1,j-1]+a[i]);

标程:
var     f:array[0..10000,0..500]of longint;        d:array[0..10000]of longint;        n,m,i,j,k,l,s,x:longint;function max(a,b:longint):longint;begin if a>b then exit(a) else exit(b); end;begin        readln(n,m);        for i:=1 to n do                readln(d[i]);        for i:=1 to n do        for j:=0 to m do        begin                if j=0 then                for k:=0 to m do                if i-k>=0 then                begin                        f[i,j]:=max(f[i,j],f[i-k,k]);                        f[i,j]:=max(f[i,j],f[i-k,0]);                end;                if j>0 then                f[i,j]:=max(f[i-1,j-1]+d[i],f[i,j]);        end;        writeln(f[n,0]);end.

原创粉丝点击