[概率期望 dp入门] 「BZOJ3450」JoyOI1952 Easy/「BZOJ4318」OSU!/分手是祝愿

先讲一讲我眼中在期望

期望就是对于所有的情况 概率*权值的总和

一般对于d[i]为处理到此时的期望

由第I步 到第j步   Change概率为p

到d[j]=(d[i]+change[i])*p+d[i]*(1-p)

因此  d[j]=d[i]*change[i]*p;

也就是说  期望只要从上一状态转移即可

这大概就是期望的特性吧

就是当前情况已经是乘上概率的情况,所以对于下一步的情况,只要乘当前情况到下一步概率即可。

其实这三题我写过很详细的题解,被删啦,下次还是先存一下吧

BZOJ3450 戳一戳

BZOJ4318 注意     较清晰题解

代码:

#include<bits/stdc++.h>
using namespace std;
long long n;
double r[200000],d1[200000],d2[200000],sum[200000];
int main()
{
	  cin>>n;
	  for (int i=1;i<=n;i++)
	    cin>>r[i];
	   for (int i=1;i<=n;i++)
	   {  
	     sum[i]=sum[i-1]+r[i]*(1+3*d1[i-1]+3*d2[i-1]);
	     d1[i]=(d1[i-1]+1)*r[i];
	     d2[i]=(d2[i-1]+d1[i-1]*2+1)*r[i]; 
	     //cout<<sum[i]<<endl;
	   } 
  printf("%.1lf",sum[n]);
}

 [六省联考2017]分手是祝愿  题解

补充一下:

考虑从大到小按,显然如果当前这盏是亮的就按。

可以证明这是最优的一种方法,并且初始状态与最优解的按下的灯的集合一一对应。

#include <bits/stdc++.h>/调半天是因为预处理没考虑清楚!t*t特判  但t*t<i的时候有可能是因数!!/
using namespace std;
const long long  mod=100003;
long long n,sum,k,ans,zhi,a[1000000],t,f[1000000];
long long pm(long long x,long long y)
{
    long long t=1;
    for (;y;x=(x*x)%mod,y=y/2)  if (y%2==1) t=(t*x)%mod;
    return t;
}
int main()
{
   cin>>n>>k;
   ans=1;sum=0;
  for (int i=1;i<=n;i++)
   ans=(ans*i)%mod;
   for (int i=1;i<=n;i++)  {  cin>>a[i];}
   for (int i=n;i>=1;i--)  if (a[i]){  zhi++; 
                                        t=sqrt(i);  if (t*t==i)  a[t]=1-a[t];
                                        for (int j=1;(t*t==i)?j<t:j<=t;j++)
                                        if (i%j==0)  {  a[j]=1-a[j]; a[i/j]=1-a[i/j];}
                                }						
   if (zhi<=k)  cout<<zhi*ans%mod<<endl; 
    else {f[n]=1;
    	  if (n==zhi) sum++;
          for (long long  j=n-1;j>=k+1;j--)
          {
           f[j]=((f[j+1])*(n-j)+n)%mod*pm(j,mod-2)%mod;
            if (j<=zhi)  sum=(sum+f[j])%mod;
          }
         sum=(sum+k)*ans%mod;
          cout<<sum<<endl;
          }
          								
                                    
} 

猜你喜欢

转载自blog.csdn.net/zzrh2018/article/details/81734890