題解 P4850 【[IOI2009]葡萄乾raisins】

来源:https://www.cnblogs.com/createsj/archive/2020/03/12/solution-p4850.html
-Advertisement-
Play Games

題目地址:https://www.luogu.com.cn/problem/P4850 題解原地址:https://createsj.blog.luogu.org/solution-p4850 ...


題目地址:https://www.luogu.com.cn/problem/P4850

題解原地址:https://createsj.blog.luogu.org/solution-p4850

更好的閱讀體驗?不存在的!


既然大家都在用記憶化搜索,那我就來個 DP 題解吧。有了 O2 誰還會用 DP ?!

狀態轉移方程很容易推出來。設問題給出的矩陣為 \(\textbf A\),其有一子矩陣,左上角坐標為 \((x_1,y_1)\) ,右下角坐標為 \((x_2,y_2)\) ,那麼當只考慮這個子矩陣時,最優解為將該子矩陣切開後的兩個矩陣的最優解的最小值與該子矩陣的各元素之和,即

\[ f_{x_1,y_1,x_2,y_2}=min_{x_1,y_1,x_2,y_2}+\sum\limits_{i=x_1}{x_2}\sum\limits_{j=y_1}^{y_2}\textbf A(i,j). \]

這個很容易用記憶化搜索實現,但應如何 DP 呢?

容易想到,我們應該枚舉每個行數和列數不都為 \(1\) 的子矩陣,並保證該子矩陣的任意子矩陣都已得出最優解。為了方便實現,我們設一子矩陣左上角坐標為 \((i,j)\) ,有 \(k\)\(l\) 列,那麼當只考慮這個子矩陣時,最優解為

\[ f_{i,j,k,l}=min_{i,j,k,l}+\sum\limits_{x=1}^k\sum\limits_{y=1}^l\textbf A(x+i,y+j). \]

這個狀態轉移方程與上面的等價,但能方便我們用 DP 實現。

至於求子矩陣各元素之和,我們可以利用首碼和的思想,用 \(sum_{i,j}\) 表示左上角坐標為 \((1,1)\) ,右下角坐標為 \((i,j)\) 的子矩陣各元素之和,那麼左上角坐標為 \((i,j)\)\(k\)\(l\) 列的子矩陣各元素之和為

\[ \sum\limits_{x=1}^k\sum\limits_{y=1}^l\textbf A(x+i,y+j)=sum_{i+k-1,j+l-1}-sum_{i+k-1,j-1}-sum_{i-1,j+l-1}+sum_{i-1,j-1}. \]

為了消去 \(-1\),我們設一子矩陣左上角坐標為 \((i+1,j+1)\) ,有 \(k\)\(l\) 列,那麼當只考慮這個子矩陣時,最優解為 \(f_{i,j,k,l}\)

核心代碼如下:

// i,j,k,l 的意義已經說明
for(register int i,j,k=1,l,c,xs,ys,min,t;k<=n;++k)
    for(l=1;l<=m;++l)
        if(k!=1 || l!=1)
            for(i=0,xs=n-k;i<=xs;++i)// xs 是為了限制 i,減少運算次數
                for(j=0,ys=m-l;j<=ys;++j)//ys 同理
                {
                    // min 表示將該子矩陣切開後的兩個矩陣的最優解的最小值
                    min=0x7fffffff;
                    // 橫著切
                    for(c=1;c<k;++c)
                    {
                        t=f[i][j][c][l]+f[i+c][j][k-c][l];
                        if(t<min)
                            min=t;
                    }
                    // 豎著切
                    for(c=1;c<l;++c)
                    {
                        t=f[i][j][k][c]+f[i][j+c][k][l-c];
                        if(t<min)
                            min=t;
                    }
                    // 狀態轉移方程
                    f[i][j][k][l]=min+sum[i+k][j+l]-sum[i+k][j]-sum[i][j+l]+sum[i][j];
                }

不用開 O2 就可以過,評測記錄證明一切。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用LinkedHashSet刪除arraylist中的重覆數據(有序) 使用HashSet去重(無序) 使用java8新特性stream進行List去重 利用List的contains方法迴圈遍歷 註:當數據元素是實體類時,需要額外重寫equals()和hashCode()方法。 例如: 以學號為 ...
  • 本人免費整理了Java高級資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高併發分散式等教程,一共30G,需要自己領取。傳送門:https://mp.weixin.qq.com/s/osB-BOl6W-ZLTSttTkqMPQ 關 ...
  • 有天上飛的概念,就要有落地的實現 概念十遍不如代碼一遍,朋友,希望你把文中所有的代碼案例都敲一遍 先贊後看,養成習慣 SpringBoot 圖文教程系列文章目錄 1. "SpringBoot圖文教程1—SpringBoot+Mybatis 環境搭建" 2. "SpringBoot圖文教程2—日誌的使 ...
  • 轉載至:https://www.cnblogs.com/skywang12345/p/3324958.html 本章的內容主要解決下麵幾個問題: 1 equals() 的作用是什麼? 2 equals() 與 == 的區別是什麼? 3 hashCode() 的作用是什麼? 4 hashCode() ...
  • ***************************APPLICATION FAILED TO START*************************** Description: Failed to configure a DataSource: 'url' attribute is no ...
  • Android系統測試, 開始測試前,我們需要先確認所測試的系統版本是否正確, 還有報bug的時候,開發需要你提供具體的系統版本信息。 還有系統打版時間等, 不同的版本修複了不同的bug,合入了不同的新功能等, 如果測試人員測試的系統版本都不對,會直接被開發懟到哭。 如何一鍵獲取Android系統版 ...
  • 模板模式 作用:定義一個操作中的演算法的骨架。而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。其關鍵是將通用演算法(邏輯)封裝在抽象基類中,並將不同的演算法細節放到子類中實現。 在我看來,模板模式的好處在於能減少代碼段的復用,把公共行為封裝到基類中,把行為 ...
  • 前幾天本猿的大學同學,一個漂亮的小姐姐工作時遇到了一個問題,她的需求是,在公司區域網的電腦上下載大量的圖片重命名成指定得1、2、3.....以此類推,需要當天完成,我就臨時給寫了一個小demo。 我的想法是採用linux的原理不就好實現嗎,直接mv到指定文件夾下再給一個新的名字不就實現了嗎 我給出的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...