概述
猫咪的进化
题目大意:
有n个实数,每一个实数可以选,可以不选,也可以选择它的平方,但如果选择了它的平方,就不能选择下一个数或下一个数的平方,求选出来的数的和最大是多少
原题:
题目描述
对于一只猫咪来说,它是有九条命的。但是并不是所有的猫咪都是这样,只有那些造化很高的猫咪才能死而复生。而且对于这样的猫咪,如果它能够活到第九条命,那么它最终可以变成任何一种它想成为的动物(当然也可以继续做猫咪啦),我们称这样的猫咪为猫神。现在一只获得了进化机会的猫咪,受到了女神snowharmony的考验。
它拥有t个单位的时间,在每个单位时间里,它可以选择沉默、叫一声“喵”、或者叫两声“喵喵”。对于每个单位时间,均有一个实数v[i],猫咪叫一声可获得v[i]的进化量,叫两声可以获得(v[i])^2的进化量,然而它在某个单位时间如果叫了两声,下一单位时间必须保持沉默来休息。
女神Snowharmony要求它以一定的方式叫,只有它最终获得了最大的进化量,它才能进化为猫神,从而变为它想成为的动物——人族zsw95。
请你帮助它计算最大进化量,使他进化为为猫神zsw95。
输入
第一行一个整数t。
第二行,t个实数v[i]。
输出
最大的进化量,保留四位小数。
输入样例
3
9 2 1
输出样例
82.0000
说明
1<=t<=800000,-255.00<=v[i]<=255.00
计算结果不超过maxlongint
解题思路:
用f[i][0],f[i][1],f[i][2]分别表示这个数字不选,选,选平方,就得出了以下状态转移方程:
f
[
i
]
[
0
]
=
m
a
x
{
(
f
[
i
−
1
]
[
0
]
f
[
i
−
1
]
[
1
]
f
[
i
−
1
]
[
2
]
f
[
i
]
[
1
]
=
m
a
x
{
f
[
i
−
1
]
[
0
]
f
[
i
−
1
]
[
1
]
}
+
x
f
[
i
]
[
2
]
=
m
a
x
{
f
[
i
−
1
]
[
0
]
f
[
i
−
1
]
[
1
]
}
+
x
∗
x
f[i][0]=maxleft{(begin{matrix}f[i-1][0]\ f[i-1][1]\ f[i-1][2]end{matrix}right.\f[i][1]=max begin{Bmatrix}f[i-1][0] \ f[i-1][1]end{Bmatrix} +x\f[i][2]=max begin{Bmatrix}f[i-1][0] \ f[i-1][1]end{Bmatrix} +x*x
f[i][0]=max⎩⎨⎧(f[i−1][0]f[i−1][1]f[i−1][2]f[i][1]=max{f[i−1][0]f[i−1][1]}+xf[i][2]=max{f[i−1][0]f[i−1][1]}+x∗x
第一个:三种情况,都可以不选
第二个:上一个不选平方才可以选他
第三个:上一个不选平方才可以选平方
然后因为时间的原因,要加快读
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n;
double x,f[800005][5];
double read()//快读
{
char ch;
int wh=1;
double z=0,y=1;
ch=getchar()
while(ch<'0'||ch>'9')//前面的空格
{
if (ch=='-') y=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')//数字
{
z=z*10+(double)(ch-48);
ch=getchar();
}
if(ch!='.') return z*y;//非小数
ch=getchar();
while(ch>='0'&&ch<='9')//小数部分
{
wh*=10;
z+=(double)(ch-48)/wh;
ch=getchar();
}
return z*y;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i)
{
x=read();
f[i][0]=max(f[i-1][0],max(f[i-1][1],f[i-1][2]));//动态转移方程
f[i][1]=max(f[i-1][0],f[i-1][1])+x;
f[i][2]=max(f[i-1][0],f[i-1][1])+x*x;
}
printf("%.4lf",max(f[n][0],max(f[n][1],f[n][2])));//要最优的
}
最后
以上就是靓丽寒风为你收集整理的【DP】猫咪的进化猫咪的进化的全部内容,希望文章能够帮你解决【DP】猫咪的进化猫咪的进化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复