【dp】cf 513G2

题目链接:http://codeforces.com/problemset/problem/513/G2

题目大意:给定有n个数的一个数列,每次操作是等概率翻转一个区间,这样操作k次,求逆序数对个数的期望。
(1 ≤ n ≤ 30, 1 ≤ k ≤ 200)
思路:

f[k][i][j] 表示k次翻转以后a[i] 在a[j] 前面的概率,初始化条件是 f[0][i][j] = 1 f[0][j][i] = 0 ( i < j )

另外翻转区间 [i, j]的概率P = 1 / ( n * (n+1)  / 2)

由于 翻转时[i, j]内元素位置都会交换,

所以枚举翻转时的要循环枚举区间内所有的元素的转移情况

(可以滚动……)

代码:

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
using namespace std;
const int N = 110;
int n, k;
double f[2][N][N];
double tmp[N][N];
int a[N];


void dp()
{
    double p = 1.0 * n * (n + 1) / 2.0;
    for (int tt = 1; tt <= k; tt++)
    {
        for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            f[tt % 2][i][j] = 0;
        for(int i = 1; i <= n; i++)
        for(int j = i + 1; j <= n; j++)
        for(int x = 1; x <= n; x++)
        for(int y = x; y <= n; y++)
        {
            int a = i, b = j;
            if(x <= i && i <= y) a = x + y - a;
            if(x <= j && j <= y) b = x + y - b;
            if(a > b) swap(a, b);
            if(x <= i && j <= y) f[tt % 2][a][b] += (1.0 - f[(tt - 1) % 2][i][j]) / p;
            else f[tt % 2][a][b] += 1.0 * f[(tt - 1) % 2][i][j] / p;
        }
    }
}

int main()
{
    while(scanf("%d%d",&n, &k) != EOF)
    {
        double re = 0;
        for(int i = 1; i <= n; i++) scanf("%d", &a[i]);

        memset(f, 0, sizeof(f));
        for(int i = 1; i <= n; i++)
        for(int j = i + 1; j <= n; j++)
            f[0][i][j] = 1.0;

        dp();

        for(int i = 1; i <= n; i++)
        for(int j = i + 1; j <= n; j++)
        {
            if(a[i] > a[j]) re += f[k % 2][i][j];
            else re += 1.0 - f[k % 2][i][j];
        }
        printf("%.15f\n", re);
    }
    return 0;
}

全部评论

相关推荐

💼公司岗位&nbsp;tx客户端岗本人背景中九硕,cpp选手。当时在牛子上看cpp选手找不到后端岗实习,遂投了腾子的客户端想练练手。🕐面试过程投递之后很快约面了,一面面试官比较和蔼问的也是正常八股加项目的模式。然后约了二面,二面面试官应该是入职后的leader,这轮面试就离谱了,一开始问了一些八股(感觉那面试官也不怎么懂技术像是照着书上写好的问题问一样),后面离谱的来了,直接疯狂压力测试(你为什么觉得你能xxx,你能不能接受xxx)。当时因为对tx还有滤镜,把自己当作一个牛马的姿态来回答这些问题。面完之后面试官可能觉得我是一个合格的牛马,他加了我微信,问我什么时候能去实习,我说六月初,他说有点晚了,然后考虑了一天还是给我过了面试,然后3面和hr面就也是正常流程了。🐶事件起因5月末的时候导师临时给安排了一个项目,于是我就去微信问那个leader,能不能推迟到6月24入职,如果不能我可以主动放弃offer,他当时犹豫再三还是同意了(现在回想起来可能是当时还没有备胎)。就在昨天他又问我什么时候入职,然后我说24号,他说有点晚叫我看看系统上还有没有其它入职时间,因为我还没在系统上填入职信息(在牛子上看到说只有快入职了,才会有人审核,遂想端午节后再填),查看不了可申请入职的时间。和他说了原因后,这下给他抓到把柄了,直接来一句&amp;quot;你对这次实习并不重视,确实没什么必要了&amp;quot;&nbsp;&nbsp;😅。感觉应该是找到备胎硬气了,就想把我踹走。不过爷也不想去了,客户端前景本来就不太好,这个leader也是个pua怪加压力怪,反正也是双向选择。最后再给大家一个建议,在面试过程中就感觉不舒服的组,一定不要去了,去了也只会更难受。 #不给转正的实习,你还去吗#&nbsp;&nbsp;#找实习多的是你不知道的事#
景洪:“在面试过程中就感觉不舒服的组,一定不要去了,去了也只会更难受。” 谢谢楼主的总结,这个太赞同了,我有次就是实习前面试感觉体验特别差,入职之后就是各种pua和压力。 大佬,你值得更好的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务