2021.8.12提高B组模拟4T1 幻象(期望dp)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021.8.12提高B组模拟4T1 幻象(期望dp)相关的知识,希望对你有一定的参考价值。

幻象

题目大意

phantom是一位爱思考的哲♂学家。
最近phantom得到了森の妖精的真传。在他练功的时候, 每秒他的思绪中都有一定的概率浮现出奇♂异的幻象,持续x秒的幻象将产生x^2 的幻象值。
phantom练功发自真心,他想知道,在N秒内他期望产生的幻象值是多少。

输入样例

第一行包含 1 个正整数 N ,表示总时间 N 秒。
第二行包含 N 个用空格隔开的在[0,100]之间的正整数,其中第i个数a[i]表示第i秒浮现幻象的概率为百分之a[i]。

3
50 50 50

输出样例

1 个实数,四舍五入后保留一位小数,表示期望幻象值。

2.8

题目数据

对于 40%的数据 N ≤ 10
对于 60%的数据 N ≤ 100
对于 100%的数据,N ≤ 10^6
数据规模较大,请使用效率较高的读入方式。

解题思路

转移方程
f i = f i   −   1 + [ ( a i   −   1 + 1 ) 2 − ( a i   −   1 ) 2 ] ∗ x f_i=f_i~_-~_1 + [(a_i~_-~_1+1)^2-(a_i~_-~_1)^2]*x fi=fi  1+[(ai  1+1)2(ai  1)2]x

x x x输入的值(记得 除以100.0)

a i a_i ai期望前面有多少个数与它相连

所以 a i a_i ai的转移为 a i = ( a i   −   1 + 1 ) ∗ x a_i=(a_i~_-~_1+1)*x ai=(ai  1+1)x

AC代码

#include<cstdio>
using namespace std;
int n;
double a[1000005],f[1000005];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		double x;
		scanf("%lf",&x);
		x/=100.0;
		a[i]=(1.0*a[i-1]+1)*x;//预处理a
		f[i]=f[i-1]+(1.0*a[i-1]*2+1)*x;//期望dp
	}
	printf("%.1lf",f[n]);
	return 0;
}
 

谢谢

以上是关于2021.8.12提高B组模拟4T1 幻象(期望dp)的主要内容,如果未能解决你的问题,请参考以下文章

2021.7.15提高B组模拟4T1 彩色圆环(期望dp)

P1654 OSU!(期望dp)

P1654 OSU!(期望dp)

2021.8.12提高B组模拟4T3 矩阵(小根堆)(map判重)

2021.8.12提高B组模拟4T3 矩阵(小根堆)(map判重)

2021.8.12提高B组模拟4T2 树上摩托(bfs)