博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 513G1 513G2 Inversions problem [概率dp]
阅读量:6579 次
发布时间:2019-06-24

本文共 2231 字,大约阅读时间需要 7 分钟。

转自九野:http://blog.csdn.net/qq574857122/article/details/43643135

题目链接:

题意:

给定n ,k

下面n个数表示有一个n的排列,

每次操作等概率翻转一个区间,操作k次。

问:

k次操作后逆序数对个数的期望。

思路:

dp[i][j]表示 a[i] 在a[j] j前面的概率

初始就是 dp[i][j]  = 1( i < j )

则对于翻转区间 [i, j], 出现的概率 P = 1 / ( n * (n+1) /2)

并且会导致 [i, j]内元素位置交换,枚举这次翻转的区间时所有的转移情况

 

 

2015-02-17 07:09:26 GNU C++ Accepted 217 ms 200 KB
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 13 #define N 105 14 #define M 10005 15 //#define mod 10000007 16 //#define p 10000007 17 #define mod2 1000000000 18 #define ll long long 19 #define ull unsigned long long 20 #define LL long long 21 #define eps 1e-6 22 //#define inf 2147483647 23 #define maxi(a,b) (a)>(b)? (a) : (b) 24 #define mini(a,b) (a)<(b)? (a) : (b) 25 26 using namespace std; 27 28 int n; 29 int k; 30 double dp[N][N]; 31 double ans; 32 double p; 33 double tmp[N][N]; 34 int v[N]; 35 36 void ini() 37 { 38 ans=0; 39 int i,j; 40 for(i=1;i<=n;i++){ 41 scanf("%d",&v[i]); 42 } 43 p=1.0*n*(n+1)/2.0; 44 memset(dp,0,sizeof(dp)); 45 for(i=1;i<=n;i++){ 46 for(j=i+1;j<=n;j++){ 47 dp[i][j]=1.0; 48 } 49 } 50 } 51 52 void solve() 53 { 54 int i,j,x,y,a,b; 55 while(k--){ 56 memcpy(tmp,dp,sizeof(dp)); 57 memset(dp,0,sizeof(dp)); 58 for(i=1;i<=n;i++){ 59 for(j=i+1;j<=n;j++){ 60 for(x=1;x<=n;x++){ 61 for(y=x;y<=n;y++){ 62 a=i;b=j; 63 if(x<=i && i<=y) a=x+y-a; 64 if(x<=j && j<=y) b=x+y-b; 65 if(a>b) swap(a,b); 66 if(x<=i && j<=y){ 67 dp[a][b]+=(1.0-tmp[i][j])/p; 68 } 69 else{ 70 dp[a][b]+=1.0*tmp[i][j]/p; 71 } 72 } 73 } 74 } 75 } 76 } 77 } 78 79 void out() 80 { 81 int i,j; 82 for(i=1;i<=n;i++){ 83 for(j=i+1;j<=n;j++){ 84 if(v[i]>v[j]){ 85 ans+=dp[i][j]; 86 } 87 else{ 88 ans+=1.0-dp[i][j]; 89 } 90 } 91 } 92 printf("%.10f\n",ans); 93 } 94 95 int main() 96 { 97 //freopen("data.in","r",stdin); 98 //freopen("data.out","w",stdout); 99 //scanf("%d",&T);100 //for(int ccnt=1;ccnt<=T;ccnt++)101 //while(T--)102 //scanf("%d%d",&n,&m);103 while(scanf("%d%d",&n,&k)!=EOF)104 {105 ini();106 solve();107 out();108 }109 return 0;110 }

 

转载于:https://www.cnblogs.com/njczy2010/p/4295108.html

你可能感兴趣的文章
Jolt大奖获奖图书
查看>>
android中webview空间通过Img 标签显示sd卡中 的图片
查看>>
ubuntu 16.04 安装PhpMyAdmin
查看>>
安卓开启多个服务
查看>>
设置分录行按钮监听事件
查看>>
C Primer Plus 第5章 运算符、表达式和语句 5.2基本运算符
查看>>
java并发库之Executors常用的创建ExecutorService的几个方法说明
查看>>
23种设计模式(1):单例模式
查看>>
socket 编程入门教程(五)UDP原理:4、“有连接”的UDP
查看>>
Jquery获取iframe中的元素
查看>>
Laravel 学习笔记5.3之 Query Builder 源码解析(下)
查看>>
Struts2简单入门实例
查看>>
2012CSDN年度博客之星评选http://vote.blog.csdn.net/item/blogstar/xyz_lmn
查看>>
BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划
查看>>
SpringBoot实战总汇--详解
查看>>
2018年7月1日笔记
查看>>
尝试使用iReport4.7(基于Ubuntu Desktop 12.04 LTS)
查看>>
动态规划:金矿模型
查看>>
子元素应该margin-top为何会影响父元素【转】
查看>>
AJAX 状态值(readyState)与状态码(status)详解
查看>>