hdu 6053(To my boyfriend)

本文介绍了一种求解矩阵中不同元素个数期望值的算法。通过枚举每个元素并计算其对所有子矩阵的贡献,最终得出矩阵不同元素的期望数量。此算法的时间复杂度大约为 O(n^4)。

-----------题目链接-------------

题目描述:

给定一个矩阵,定义\(f(A)\) 为矩阵中不同元素的个数。现在要求\(f(A)\)的期望。

解法:

首先来暴力的,复杂度大约:\(O(n^{4})\)。枚举原矩阵中每一个数字的贡献数,

LL submatix(int x,int y)
{
    LL res=1ll*x*(x+1)*y*(y+1)/4;
    return res;
}
LL find(int x,int y)
{
    LL res;
    int L=1,R;
    int val=maze[x][y];
    R=y;
    for(int i=y+1;i<=m;i++)
    {
        if(maze[x][i]==val) break;
        R=i;
    }
    res=1ll*x*y*(R-y+1);
    for(int i=x+1;i<=n;i++)
    {
        int l,r;
        if(maze[i][y]==val) break;
        for(int j=y;j>=max(1,L) ;j--)
        {
            if(maze[i][j]==val) break;
            l=j;
        }
        for(int j=y;j<=min(m,R);j++) 
        {
            if(maze[i][j]==val) break;
            r=j;
        }
        res+=1ll*x*(y-l+1)*(r-y+1);
        L=max(L,l),R=min(R,r);
    }
    return res;
}
double get()
{
    LL sum=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            sum+=find(i,j);
        }
    }
    return (double)sum;
}
 
int main()
{
    int ncase;
    scanf("%d",&ncase);
    while(ncase--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                scanf("%d",&maze[i][j]);
        }
        printf("%.9lf\n",get()/submatix(n,m));
    }
    return 0;
}

转载于:https://www.cnblogs.com/coded-ream/p/7275341.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值