2019.3.2 提高B组T1 SSL-1296 猫咪的进化

版权声明:虽然本蒟蒻很菜,但各位dalao转载请注明出处谢谢。 https://blog.csdn.net/xuxiayang/article/details/88077538

D e s c r i p t i o n Description

n n 个点,每个点要么选它要么选它的平方要么不选,如果选了它的平方就不能选它下一个节点

数据范围: n 8 × 1 0 5 n\leq 8\times 10^5


S o l u t i o n Solution

依赖性关系只有这个节点和下一个节点,可以说是一个比较简单的链形DP了

f [ i ] [ x ] f[i][x] 表示第 i i 个数的情况,0表示不选,1表示选它,2表示选它的平方

我这次不选的话,我上次怎么选都行,得到方程
f [ i ] [ 0 ] = m a x { f [ i 1 ] [ 0 ] , f [ i 1 ] [ 1 ] , f [ i 2 ] [ 2 ] } f[i][0]=max\{f[i-1][0],f[i-1][1],f[i-2][2]\}

这次选本身的话,则上次可以不选,也可以选则上一个数,得到方程
f [ i ] [ 1 ] = m a x { f [ i 1 ] [ 0 ] , f [ i 1 ] [ 1 ] } + a [ i ] f[i][1]=max\{f[i-1][0],f[i-1][1]\}+a[i]

这次选平方的话,则上次可以不选,也可以选则上一个数,得到方程

f [ i ] [ 2 ] = m a x { f [ i 1 ] [ 0 ] , f [ i 1 ] [ 1 ] } + a [ i ] 2 f[i][2]=max\{f[i-1][0],f[i-1][1]\}+a[i]^2

实际上我们可以发现, f [ i ] f[i] 只和 f [ i 1 ] f[i-1] 有关,所以我们可以滚动压缩


C o d e Code

#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-fhoist-adjacent-loads")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;int n;
double x,f[2][3];
bool u,v;
double read()//小数读入优化
{
	double d=0,ff=1;
	char ch=getchar();
	while(!isdigit(ch))
	{
		if (ch=='-') ff=-1;
		ch=getchar();
	}
	while (isdigit(ch))
		d=d*10+(double)(ch-48),ch=getchar();
	if (ch!='.') return d*ff;
	double cnt=10;
	ch=getchar();
	while (isdigit(ch))
		d=d+((double)(ch-48)/cnt),ch=getchar(),cnt*=10.0;
	return d*ff;
}
signed main()
{
	memset(f,0xcf,sizeof(f));
	scanf("%d",&n);
	f[0][0]=f[0][1]=f[0][2]=0;u=1;v=0;
	for(register int i=1;i<=n;++i)
	{
		u^=1;v^=1;
		x=read();
		f[v][0]=max(f[u][0],max(f[u][1],f[u][2]));
		f[v][1]=max(f[u][0],f[u][1])+x;
		f[v][2]=max(f[u][0],f[u][1])+x*x;
	}
	printf("%.4lf",max(max(f[v][0],f[v][1]),f[v][2]));
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/88077538
今日推荐