[tyvj 1449] 猫咪的进化{动态规划}

版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/88075746

题目

http://www.joyoi.cn/problem/tyvj-1449


解题思路

手推方程,需要用实数的快速读入。

double read(){
	double p=0,ff=1; char c=getchar(); 
	while (!isdigit(c)) {if (c=='-') ff=-1; c=getchar();}
	while (isdigit(c)) p=p*10+c-48,c=getchar();
	if (c!='.') return p*ff; 
	double w=10; c=getchar();  
	while (isdigit(c)) p+=(c-48)/w,w*=10,c=getchar(); 
	return p*ff; 
}

f [ i ] [ 0 / 1 / 2 ] f[i][0/1/2] 分别表示 i i 时响一声、响两声和沉默的最优值。
答案显然是三者的最优值。


代码

#include<cstdio>
#include<algorithm>
#include<string>
#define rr register 
using namespace std;
int t; double v[800100],g[800100][3]; 
double read(){
	double p=0,ff=1; char c=getchar(); 
	while (!isdigit(c)) {if (c=='-') ff=-1; c=getchar();}
	while (isdigit(c)) p=p*10+c-48,c=getchar();
	if (c!='.') return p*ff; 
	double w=10; c=getchar();  
	while (isdigit(c)) p+=(c-48)/w,w*=10,c=getchar(); 
	return p*ff; 
}
int main(){
	scanf("%d",&t); 
	for (rr int i=1;i<=t;i++) v[i]=read(); 
	g[0][0]=g[0][1]=g[0][2]=0; 
	for (rr int i=1;i<=t;i++){
	 g[i][0]=max(g[i-1][2],g[i-1][0])+v[i]; 
	 g[i][1]=max(g[i-1][2],g[i-1][0])+v[i]*v[i]; 
	 g[i][2]=max(max(g[i-1][0],g[i-1][1]),g[i-1][2]); 
	}
	printf("%.4lf",max(max(g[t][0],g[t][1]),g[t][2])); 
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/88075746