hdu 6053(To my boyfriend)

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

题目描述:

给定一个矩阵,定义(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
",get()/submatix(n,m));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/coded-ream/p/7275341.html