1. 程式人生 > >CodeForces - 258D:Little Elephant and Broken Sorting(概率DP)

CodeForces - 258D:Little Elephant and Broken Sorting(概率DP)

題意:長度為n的排列,m次交換xi, yi,每個交換x,y有50%的概率不發生,問逆序數的期望  。n, m <= 1000

思路:我們只用維護大小關係,dp[i][j]表示位置i的數比位置j的數大的概率。

那麼每次交換x和y。  假設x<y,那麼區間就有三種:  [1,x-1],[x+1,y-1], [y+1,N], 不難證明這三個區間和xy處的逆序對關係變為二者和的一半。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace
std; const int maxn=1010; double dp[maxn][maxn],ans; int a[maxn]; int main() { int N,M,x,y; scanf("%d%d",&N,&M); rep(i,1,N) scanf("%d",&a[i]); rep(i,1,N) rep(j,1,N) dp[i][j]=a[i]>a[j]; rep(i,1,M){ scanf("%d%d",&x,&y); rep(j,
1,N){ if(j==x||j==y) continue; dp[j][x]=dp[j][y]=(dp[j][x]+dp[j][y])/2; dp[x][j]=dp[y][j]=(dp[x][j]+dp[y][j])/2; } dp[x][y]=dp[y][x]=0.5; } rep(i,1,N) rep(j,i+1,N) ans+=dp[i][j]; printf("%.6lf\n",ans); return 0; }