首页 > 其他分享 >CF2000F Color Rows and Columns

CF2000F Color Rows and Columns

时间:2024-09-23 17:55:31浏览次数:6  
标签:贡献 Rows Color 花费 最小 int 1007 矩形 Columns

题目链接

题解

知识点:贪心、背包dp。

先考虑一个矩形的情况:

  1. 若是方形,行列交替染色最优。
  2. 若不是方形,选行列中较小的一侧染色,直到变为方形。

因此,我们可以根据上面的结论预处理 \(c_{i,j}\) ,表示第 \(i\) 个矩形贡献为 \(j\) 的最小花费。

现在考虑多个矩形的情况,显然是一个分组背包问题。每个矩形为一个组,第 \(i\) 个矩形有 \(a_i + b_i + 1\) 个项(包括不选) ,第 \(j\) 项贡献为 \(j\) 花费是 \(c_{i,j}\) ,每组只能选一个。

我们设 \(f_{i,j}\) 表示前 \(i\) 个矩形贡献为 \(j\) 时的最小花费。特别地,根据题意我们采用一个技巧,定义 \(f_{i,k}\) 表示前 \(i\) 个矩形贡献至少为 \(k\) 时的最小花费。

计算花费有两种方法,打表法和刷表法,前者寻找前导状态更新当前状态,后者寻找后继状态更新后继状态,采用上述技巧后更适合采用刷表法。打表法实现和效率都会更复杂,因为 \(f_{i, k}\) 的前导状态将变为 \(\sum w_{i,j} = \sum_{j = 0}^{a_i + b_i} j\) ,而非 \(j\) 个。

初始化正无穷,\(f_{0, 0} = 0\) ,转移方程如下:

for (int i = 1;i <= n;i++) {
    for (int j = 0;j <= k;j++) {
        for (int id = 0;id <= a[i] + b[i];id++) {
            f[i][min(k, j + id)] = min(f[i][min(k, j + id)], f[i - 1][j] + c[i][id]);
        }
    }
}

此外,如果采用单行滚动数组优化,第二层循环应变为逆序,且第二层和第三层循环不能交换。

当然,也可以采用两行数组实现滚动数组,更方便。

时间复杂度 \(O(nk\max\{ a_i, b_i\})\)

空间复杂度 \(O(n(k+\max\{ a_i, b_i\}))\)

代码

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

int a[1007], b[1007];

int c[1007][207]; // 第 i 个矩形贡献为 j 的最小花费
int f[1007][107]; // 前 i 个矩形贡献为 j 的最小花费,分组背包

bool solve() {
    int n, k;
    cin >> n >> k;
    for (int i = 1;i <= n;i++) {
        cin >> a[i] >> b[i];
        int delta = abs(a[i] - b[i]);
        // 短边先填,直至方形
        for (int j = 1;j <= delta;j++) c[i][j] = c[i][j - 1] + min(a[i], b[i]);
        // 方形行列交替填
        for (int j = delta + 1; j <= a[i] + b[i];j++) c[i][j] = c[i][j - 1] + min(a[i], b[i]) - (j - delta) / 2;
    }

    for (int i = 0;i <= n;i++)
        for (int j = 0;j <= k;j++)
            f[i][j] = 1e9;

    // 建议刷表法,因为 fi,k 表示前 i 个矩形贡献 >= k 的最小花费,填表法在 fi,k 的处理会更复杂,效率也更低
    f[0][0] = 0;
    for (int i = 1;i <= n;i++) {
        for (int j = 0;j <= k;j++) {
            for (int id = 0;id <= a[i] + b[i];id++) {
                f[i][min(k, j + id)] = min(f[i][min(k, j + id)], f[i - 1][j] + c[i][id]);
            }
        }
    }

    cout << (f[n][k] > 1e8 ? -1 : f[n][k]) << '\n';

    return true;
}

int main() {
    std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << -1 << '\n';
    }
    return 0;
}

标签:贡献,Rows,Color,花费,最小,int,1007,矩形,Columns
From: https://www.cnblogs.com/BlankYang/p/18427520

相关文章

  • CF2001D Color Rows and Columns
    题目链接题解知识点:贪心,STL。显然,子序列最长长度是数的种类数,即保证每个数都会被选到。子序列的奇数位要尽可能大、偶数位尽可能小。我们从左到右依次选择子序列的数,为了保证每个数都能被选到,我们预处理出每个数的最晚出现位置\(lst\)。每次选择,只有在当前还未选择的数的\(......
  • Java反序列化利用链篇 | JdbcRowSetImpl利用链分析
    JdbcRowSetImpl利用链前言首先说明一下:利用链都有自己的使用场景,要根据场景进行选择不同的利用链。JdbcRowSetImpl利用链用于fastjson反序列化漏洞中。为什么?因为fastjson会在反序列化类时自动调用set开头的方法(不一定是setter方法),而JdbcRowSetImpl中存在一个set开头的方法,即......
  • WPF dynamically generate grid with calculated rows and columns, put the custom c
    privatevoidFillGridRandomly(){rowsColsSet=newHashSet<XY>();if(gd!=null){gd.Children.Clear();}for(inti=0;i<50;i++){while(true){XYxy=newXY();......
  • WPF System.Windows.Media.Color A value must be set, display ball and number in c
    privateColorGetRndColor(){Colorcr=newColor();cr.A=255;cr.R=(byte)(rnd.Next(0,255));cr.G=(byte)(rnd.Next(0,255));cr.B=(byte)(rnd.Next(0,255));returncr;}         //usercontrol.......
  • Python使用browser_cookie3库来读取浏览器Cookies
    browser_cookie3是一个用于从浏览器中提取Cookies的Python模块。下面是使用该模块的步骤:1.安装browser_cookie3模块。pipinstallbrowser_cookie32.导入browser_cookie3模块。 import browser_cookie33.提取浏览器Cookies。可以使用下面的代码提取GoogleC......
  • WPF WebBrowser suppress script errors
    ScriptError,Anerrorhasoccuredinthescriptonthispage.Doyouwanttocontinuerunningscriptsonthispage?   //xaml<Windowx:Class="WpfApp378.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/present......
  • AGC026D Histogram Coloring 题解
    [AGC026D]HistogramColoring题解给定\(n\)列的网格,每列高为\(h_i\),将每个格子染色成红色或蓝色,使得每个\(2\times2\)的区域都恰好有两个蓝格子和两个红格子,求方案数(对\(10^9+7\)取模)。\(1\leqn\leq100,1\leqh_i\leq10^9\)性质为了方便讲述,先假设\(h_i=h_{i+......
  • 【鸿蒙应用开发】常见的容器组件:ColumnSplit、RowSplit和Flex
    上一章已经了解了Column和Row的一些属性,以下是几个案例:设置子组件水平方向的间距为:5@Entry@Preview@ComponentstructIndex{@Statemessage:string='Hello鸿蒙';controller:webview.WebviewController=newwebview.WebviewController();build(){Column(......
  • EmbeddedBrowserWebView.dll文件丢失导致程序无法运行问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个EmbeddedBrowserWebView.dll文件(挑选合适的......
  • GEOG 2500 Web Browsing
    GEOG2500–Fall2024Lab1:WebBrowsing&IntroductiontoESRIWebTraining  Objectives:•   Becomefamiliarwiththewwwto learnaboutGIS andto access Geographic Data•   Locatewebsitesthatcan be useful inyourGISworld• ......