【DP】猫咪的进化

版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/ssllyf/article/details/88075949

猫咪的进化

题目大意:

有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]=max\left\{(\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
第一个:三种情况,都可以不选
第二个:上一个不选平方才可以选他
第三个:上一个不选平方才可以选平方
然后因为时间的原因,要加快读

代码:

#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])));//要最优的
}

猜你喜欢

转载自blog.csdn.net/ssllyf/article/details/88075949