[Tyvj Feb]猫咪的进化(TYVJ1449)

[Tyvj Feb]猫咪的进化

背景 Background

 对于一只猫咪来说,它是有九条命的。但是并不是所有的猫咪都是这样,只有那些造化很高的猫咪才能死而复生。而且对于这样的猫咪,如果它能够活到第九条命,那么它最终可以变成任何一种它想成为的动物(当然也可以继续做猫咪啦),我们称这样的猫咪为猫神。现在一只获得了进化机会的猫咪,受到了女神snowharmony的考验。

描述 Description

 它拥有t个单位的时间,在每个单位时间里,它可以选择沉默、叫一声“喵”、或者叫两声“喵喵”。对于每个单位时间,均有一个实数v[i],猫咪叫一声可获得v[i]的进化量,叫两声可以获得(v[i])^2的进化量,然而它在某个单位时间如果叫了两声,下一单位时间必须保持沉默来休息。
女神Snowharmony要求它以一定的方式叫,只有它最终获得了最大的进化量,它才能进化为猫神,从而变为它想成为的动物——人族zsw95。
请你帮助它计算最大进化量,使他进化为为猫神zsw95。

输入格式 Input Format

 输入:
第一行一个整数t。
第二行,t个实数v[i]。

输出格式 Output Format

最大的进化量,保留四位小数。

样例输入 Sample Input
3
9 2 1

样例输出 Sample Output

82.0000


算法:递推

挺简单的递推题,用f[i,1]表示i时间叫一声的最大进化量,同理f[i,2]表示i时间叫两声的最大进化量。然后很简单的两个转移方程,最后max(f[n,1],f[n,2])即可。


program cat;

const
 maxn=800000;

var
 n:longint;
 a:array [0..maxn] of real;
 f:array [0..maxn,1..2] of real;

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

function max(x,y:real):real;
begin
 if x>y then exit(x) else exit(y);
end;

procedure main;
var
 i:longint;
begin
 f[1,1]:=a[1];
 f[1,2]:=sqr(a[1]);
 for i:=2 to n do
  begin
   f[i,1]:=max(f[i-2,2]+a[i],max(f[i-1,1]+a[i],f[i-1,1]));
   f[i,2]:=max(f[i-2,2]+sqr(a[i]),max(f[i-1,1]+sqr(a[i]),f[i-1,2]));
  end;
end;

begin
 assign(input,'cat.in'); reset(input);
 assign(output,'cat.out'); rewrite(output);

 init;
 main;
 writeln(max(f[n,1],f[n,2]):0:4);

 close(input); close(output);
end.


你可能感兴趣的:(tyvj)