版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 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;
}
设
分别表示
时响一声、响两声和沉默的最优值。
答案显然是三者的最优值。
代码
#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]));
}