Counting Special Sub-Cubes

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjucor/article/details/82686331

dp[w][i][j][k]表示左上角坐标为(i,j,k)大小为w的cube的最大值

状态转移:dp[w+1][i][j][k]=max(dp[w][i+a][j+b][k+c]) a,b,c={0,1}


def specialSubCubes(n,a):
    cube=[[[0 for _ in range(n)] for _ in range(n)] for _ in range(n)]
    p=0
    for i in range(n):
        for j in range(n):
            for k in range(n):
                cube[i][j][k]=a[p]
                p+=1
                
    dp=[[[[0 for _ in range(n)] for _ in range(n)] for _ in range(n)] for _ in range(n)]
    dp[0]=cube
    res=[0]*n
    res[0]=a.count(1)
    for w in range(1,n):
        for i in range(n-w):
            for j in range(n-w):
                for k in range(n-w):
                    t=[dp[w-1][i][j][k], dp[w-1][i][j][k+1], dp[w-1][i][j+1][k], dp[w-1][i][j+1][k+1],
                       dp[w-1][i+1][j][k], dp[w-1][i+1][j][k+1], dp[w-1][i+1][j+1][k], dp[w-1][i+1][j+1][k+1]]
                    dp[w][i][j][k]=max(t)
                    if dp[w][i][j][k]==w+1: res[w]+=1
#    print(dp)               
    return res


if __name__ == '__main__':
    q = int(input())
    for q_itr in range(q):
        n = int(input())
        cube = list(map(int, input().rstrip().split()))
        result = specialSubCubes(n,cube)
        print(' '.join(list(map(str,result))))

猜你喜欢

转载自blog.csdn.net/zjucor/article/details/82686331