Codeforces - Little Elephant and Broken Sorting
阿新 • • 發佈:2021-01-07
技術標籤:Codeforces動態規劃思維題
題目連結:Codeforces - Little Elephant and Broken Sorting
令 dp[i][j] 為 a[i] > a[j] 的概率。
然後對於每次交換:交換位置為x,y
dp[k][a] = dp[k][b] = ( dp[k][a] + dp[k][b] ) / 2
dp[a][k] = dp[b][k] = 1.0 - dp[k][a]
轉移很顯然。
最後 dp[a][b] = dp[b][a] = 0.5
AC程式碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1010;
int n,m,a[N]; double dp[N][N],res;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dp[i][j]=1.0*(a[i]>a[j]);
for(int i=1,a, b;i<=m;i++){
cin>>a>>b;
for(int j=1;j<=n;j++)
dp[j][a]=dp[j][b]=(dp[j][a]+dp[j][b])/2,
dp[a][j]=dp[b][j]=1.0-dp[j][a];
dp[a][b]=dp[b][a]=0.5;
}
for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) res+=dp[i][j];
printf("%.10lf\n",res);
return 0;
}