Algorithm 在小于O(N^4)的范围内使用K个矩形最小化总面积

Algorithm 在小于O(N^4)的范围内使用K个矩形最小化总面积,algorithm,dynamic-programming,Algorithm,Dynamic Programming,给定N个数字的递增序列(最多T个),我们最多可以使用K个矩形(从位置0开始放置),例如对于序列中的第i个值v,在位置[v,T]中存在一个高度至少为i+1的矩形 矩形的总面积应为满足上述要求的最小值 示例:给定序列[0,3,4],T=5和K=2,我们可以使用: 从0到2的高度为1的矩形(因此面积为3) 从3到4的矩形,高度为3(因此面积为6) 最多使用2个矩形,我们无法得到小于9的总面积 这个问题可以用DP来解决 int dp[MAXK+1][MAXN][MAXN]; int sequence

给定N个数字的递增序列(最多T个),我们最多可以使用K个矩形(从位置0开始放置),例如对于序列中的第i个值v,在位置[v,T]中存在一个高度至少为i+1的矩形

矩形的总面积应为满足上述要求的最小值

示例:给定序列[0,3,4],T=5和K=2,我们可以使用:

  • 从0到2的高度为1的矩形(因此面积为3)
  • 从3到4的矩形,高度为3(因此面积为6)
最多使用2个矩形,我们无法得到小于9的总面积

这个问题可以用DP来解决

int dp[MAXK+1][MAXN][MAXN];
int sequence[MAXN];
int filldp(int cur_idx, int cur_value, int cur_K) {
    int res = dp[cur_K][cur_idx][cur_value];
    if (res != -1) return res;

    res = INF;
    if (cur_idx == N - 1 && cur_value >= N)
        res = min(res, (T - seq[cur_idx]) * cur_value);
    else {
        if (cur_idx < N - 1 && cur_value >= cur_idx + 1) {
            int cur_cost = (seq[cur_idx + 1] - seq[cur_idx]) * cur_value;
            res = min(res, cur_cost + filldp(cur_idx + 1, cur_value, cur_K);
        }

        // Try every possible height for a rectangle
        if (cur_K < K)
            for (int new_value = cur_value + 1; cur_value <= N; new_value++)
                res = min(res, filldp(cur_idx, new_value, cur_K + 1));
    }
    dp[cur_K][cur_idx][cur_value] = res;
    return res;
}
int-dp[MAXK+1][MAXN][MAXN];
整数序列[MAXN];
int filldp(int cur_idx,int cur_value,int cur_K){
int res=dp[cur_K][cur_idx][cur_value];
如果(res!=-1)返回res;
res=INF;
如果(cur_idx==N-1&&cur_值>=N)
res=最小值(res,(T-顺序[cur_idx])*cur_值);
否则{
如果(cur_idx=cur_idx+1){
int cur_成本=(顺序[cur_idx+1]-顺序[cur_idx])*cur_值;
res=min(res,cur_成本+filldp(cur_idx+1,cur_值,cur_K);
}
//尝试矩形的所有可能高度
if(cur_K对于(NexOnValue= CuryValue+1;CurrValk),问题可以用DP来解决,但是你的代码是蛮力的。考虑把矩形按高度/宽度排序,看看经典的“计数改变”的解决方案。问题并从那里开始工作。T的最大值是多少?你的算法实际上是TxN^3@SaeedAmiriMAXT是3600,但我不明白为什么是TN^3而不是N^3。有一个矩阵是nxxt,实际上是cur_值,在你的过程中范围是1..t。另一方面,为了填充这个矩阵,在这个过程中你有O(N)对于循环,它是O(Nx sizeof_矩阵)。
cur_值的范围为0…N,因为它是矩形的高度,且高度不超过N是有意义的。