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.8.12提高B组模拟4T3 矩阵(小根堆)(map判重)