ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

期望 DP CF258D题解

2022-01-11 15:02:23  阅读:119  来源: 互联网

标签:CF258D 期望 int 题解 scanf d% 我们 转移 DP


太厉害啦

首先做期望题最不能忘记的就是期望的线性性。

所以我们直接将全局逆序对对数拆成两个数其中一个比另一个大的期望(概率),设为 \(f[i][j]\),初值为 \([a_i>b_j]\)。

如果我们修改两个位置 \(x,y\),最直接的修改一定就是令 \(f[x][y]=0.5\)。

那么别的位置呢?

我们发现这会令 \(f[i][x]=f[i][y],f[x][i]=f[y][i]\),而且因为这是一个排列,很明显有 \(f[a][b]+f[b][a]=1\)。

那么我们怎么才能转移 \(f\)?

很容易发现一件事情,转移前的 \(f[i][x]+f[i][y]\) 等于转移后的 \(f[i][x]+f[i][y]\)。

为什么呢?我比两个数大的概率之和,然后交换一下,明显还是不变嘛。

所以有新的 \(f[i][x]=f[i][y]\) 等于原来的 \(\frac {f[i][x]+f[i][y]} 2\)。

于是这样大力转移就好啦。

#include<cstdio>
const int M=1005;
int n,m,a[M];double ans,dp[M][M];
signed main(){
	int i,j,x,y;scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)scanf("%d",a+i);
	for(i=1;i<=n;++i)for(j=1;j<=n;++j)dp[i][j]=a[i]>a[j];
	while(m--){
		scanf("%d%d",&x,&y);
		for(i=1;i<=n;++i)dp[x][i]=dp[y][i]=.5*(dp[x][i]+dp[y][i]),dp[i][x]=dp[i][y]=1-dp[x][i];dp[x][y]=dp[y][x]=.5;
	}
	for(i=1;i<=n;++i)for(j=i+1;j<=n;++j)ans+=dp[i][j];printf("%.9lf",ans);
}

标签:CF258D,期望,int,题解,scanf,d%,我们,转移,DP
来源: https://www.cnblogs.com/lmpp/p/15788316.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有