观察数据范围,H 和 W 的数据范围很容易让我们想到状压或者高维dp。这题是高维dp。

考虑 min{最大值-最小值} 问题怎么转换。我们可以枚举最小值,然后dp最小化最大值。

蛋糕块草莓数量的可能取值与子矩形的个数相同,只有 n4/4n^4/4 个,最小值只需要从中枚举。

考虑dp的状态设计,dp[a][b][c][d][t]dp[a][b][c][d][t] 表示以 a,ba,b 为上下边界, c,dc,d 为左右边界的矩形,进行 tt 次切割,在枚举的最小值限制下,所能分割出的最小的最大值是多少。

考虑dp转移设计,枚举切割线复杂度是 2n2n 的,枚举 tt 次切割在两个矩形的分配是 O(t)=O(n2)O(t)=O(n^2) 的。

草稿纸演算时间复杂度,先枚举最小值 n4/4n^4/4 ,然后枚举 dp 状态 n4n2n^4 * n^2 ,最后是 dp 转移 2nn22n * n^2

我们发现,复杂度量级是惊人的 n13=1e10n^{13} = 1e10

但是在dp过程中有很多剪枝,单单状态剪枝就能使复杂度降到 3e83e8

这里我们可以写程序辅助我们计算剪枝复杂度:

#include<bits/stdc++.h>
using namespace std;

int main() {
    int cnt=0;
    for(int a=1;a<=6;a++){
        for(int b=a;b<=6;b++){
            for(int c=1;c<=6;c++){
                for(int d=c;d<=6;d++){
                    for(int t=0;t<(b-a+1)*(d-c+1);t++){
                        cnt++;
                    }
                }
            }
        }
    }
    cout<<cnt;
    return 0;
}

这份代码对矩形的边界枚举进行了/4的剪枝,对 tt 值的上限也进行了剪枝。最后程序输出了 31363136

我们重新计算复杂度:枚举最小值 n4/4n^4/4 ,然后枚举 dp 状态 3e33e3 ,最后是 dp 转移 2nn22n * n^2

n7/23e3=3e8n^7/2 * 3e3=3e8 ,复杂度很安全,放心冲吧!

0 条评论

目前还没有评论...