[luoguP2331] [SCOI2005]最大子矩陣(DP)

傳送門

?

orz不會做。。。

?

一個好理解的做法(n^3*k):

分n=1和n=2兩種情況考慮。

n=1時,預處理出前綴和sum[]。

設f[i][j]為到達第i格,已經放了j個子矩陣的最大和,

那么每次先把f[i][j]的值設為f[i-1][j](第i個元素不屬于第j個子矩陣)

剩下的情況就是第i個元素屬于第j個子矩陣了。

這時候用max(f[h-1][j-1]+(sum[i]-sum[h-1]), 1<=h<=i)更新f[i][j]的最大值,即枚舉第j個子矩陣的起始點。

最終答案為f[m][k]。(邊界條件為f[0][j]=0,包含空矩陣)

n=2時,預處理出分別列的前綴和sum1[],sum2[]。

設f[i][j][l]為在第1列到達第i格,第2列到達第j格,已經放了l個子矩陣的最大和,

那么每次先把f[i][j][l]的值設為max(f[i-1][j][l],f[i][j-1][l])(第i行第1列不屬于子矩陣或第j行第2列不屬于子矩陣,兩者取較大值)

剩下的情況就是第i行第1列和第j行第2列都屬于子矩陣了。

分兩種情況:

一、第i行第1列和第j行第2列屬于不同的子矩陣

分別枚舉第i行第1列所在子矩陣的起始點和第j行第2列所在子矩陣的起始點并更新答案,

即用max(f[h-1][j][l-1]+(sum1[i]-sum1[h-1]), 1<=h<=i)和max(f[i][h-1][l-1]+(sum2[j]-sum2[h-1]),1<=h<=j)更新f[i][j]的最大值。

二、第i行第1列和第j行第2列屬于同一子矩陣

僅當i==j時才包含這種情況(因為i和j要作為當前狀態中子矩陣的末尾)。這時候這個子矩陣的列數必定為2。

還是一樣枚舉子矩陣的起始點,

在i==j的條件下用max(f[h-1][h-1][l-1]+(sum1[i]-sum1[h-1])+(sum2[j]-sum2[h-1]),1<=h<=i)更新答案。

最后答案為f[m][m][k](邊界條件為f[0][0][l]=0,包含空矩陣)

?

#include <cstdio>
#define M 15
#define N 105 
#define max(x, y) ((x) > (y) ? (x) : (y))int n, m, K;
int sum[N][M];
int f[N][N][M], f0[N][M];int main()
{int i, j, k, l, x;scanf("%d %d %d", &n, &m, &K);for(i = 1; i <= n; i++)for(j = 1; j <= m; j++){scanf("%d", &x);sum[i][j] = sum[i - 1][j] + x;}if(m == 1){for(i = 1; i <= n; i++)for(j = 1; j <= K; j++){f0[i][j] = f0[i - 1][j];for(k = 1; k <= i; k++)f0[i][j] = max(f0[i][j], f0[k - 1][j - 1] + sum[i][1] - sum[k - 1][1]);}printf("%d\n", f0[n][K]);return 0;}for(i = 1; i <= n; i++)for(j = 1; j <= n; j++)for(k = 1; k <= K; k++){f[i][j][k] = max(f[i - 1][j][k], f[i][j - 1][k]);for(l = 1; l <= i; l++)f[i][j][k] = max(f[i][j][k], f[l - 1][j][k - 1] + sum[i][1] - sum[l - 1][1]);for(l = 1; l <= j; l++)f[i][j][k] = max(f[i][j][k], f[i][l - 1][k - 1] + sum[j][2] - sum[l - 1][2]);if(i == j)for(l = 1; l <= i; l++)f[i][i][k] = max(f[i][i][k], f[l - 1][l - 1][k - 1] + sum[i][1] - sum[l - 1][1] + sum[i][2] - sum[l - 1][2]);}printf("%d\n", f[n][n][K]);return 0;
}

  
還看到一個比較神的nk做法

O(Nk)時間復雜度0ms過

只有一列的不用說吧,我說下兩列的

考慮每一行的狀態

0 空出這一行

1 選擇左邊空出右邊

2 選擇右邊空出左邊

3 選擇這一行兩個(不作為一個矩陣,而是左邊一列單獨一個矩陣,右邊單獨一個矩陣)

4 選擇這一行兩個(兩個一塊作為一個矩陣的一部分)

定義f[i,j,k]為當前處理到第i行,已經選了j個矩陣,當前行狀態為k的最大值(k為上面的0-4種狀態)

如果空出這一行,則j不需要變化,直接繼承上一行的各種狀態的最大值

f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1],f[i-1][j][2],f[i-1][j][3],f[i-1][j][4]);

如果選擇左邊空出右邊,如果上一行的左邊沒有單獨地選擇成為矩陣的話(即選擇1或3),則j需要包含新選擇成為的矩陣(即這一行的左邊的這個矩陣),

如果上一行為同時選擇兩列的為一個矩陣的狀態,則只選擇單獨的左邊是不能包含進去上一行的矩陣的,所以也應j-1(t1為這一行左邊的值)

f[i][j][1]=max(f[i-1][j-1][0],f[i-1][j][1],f[i-1][j-1][2],f[i-1][j][3], f[i-1][j-1][4])+t1;

右邊同理(t2為這一行右邊的值)

f[i][j][2]=max(f[i-1][j-1][0],f[i-1][j-1][1],f[i-1][j][2],f[i-1][j][3], f[i-1][j-1][4])+t2;

選擇兩個分別單獨作為矩陣,類似只選擇左邊或右邊,不過是單獨選左邊和右邊合并了下

f[i][j][3]=max(f[i-1][j-1][1],f[i-1][j-1][2],f[i-1][j][3])+t1+t2;

if(j>=2) f[i][j][3]=max(f[i][j][3],f[i-1][j-2][4]+t1+t2);

選擇兩個作為一個矩陣,則上一行除了可以接上的,都得j-1

f[i][j][4]=max(f[i-1][j-1][0],f[i-1][j-1][1],f[i-1][j-1][2],f[i-1][j-1][3],f[i-1][j][4])+t1+t2;

轉載于:https://www.cnblogs.com/zhenghaotian/p/7608166.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251774.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251774.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251774.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

想要去阿里面試?你必須得跨過 JVM 這道坎!

概述 很多人想要到阿里巴巴、美團、京東等互聯網大公司去面試&#xff0c;但是現在互聯網大廠面試一般都必定會考核JVM相關的知識積累和實踐經驗&#xff0c;畢竟線上系統寫好代碼部署之后&#xff0c;每個工程師都必須關注JVM相關的東西&#xff0c;比如OOM、GC等問題. 所以一…

醫學知識圖譜一

大綱 知識自動提取技術 醫學知識融合 醫學知識推理 轉載于:https://www.cnblogs.com/quietwalk/p/9000950.html

在一個div里,列表樣式圖片進行float,實現水平排序

<div class"xiangce"><ul> <li><a href"#"><img src"images/pic4.gif" alt"">產品名稱</a></li><li><a href"#"><img src"images/pic4.gif" alt"…

團隊開發git使用各種問題

參考:https://www.cnblogs.com/schaepher/p/4933873.html 問題-3:保持github上項目干凈&#xff0c;對于在不同機器上運行會不同的文件不予維護(如.idea/workspace.xml) 建議:對于項目輸出在項目目錄中的文件不予維護 對于IDE自動生成且與項目所在目錄有關的文件不予維護 將這些…

filebeat 亂碼

查看 文件的類型 [rootelk-node-1 rsyslog] # file 192.168.1.16.log 192.168.1.16.log: Non-ISO extended-ASCII text, with very long lines, with LF, NEL line terminators 如果命令返回結果說明改日志為utf-8&#xff0c;則logstash配置文件中charset設置為UTF-8 如果命令…

團隊編程項目代碼設計規范(爬取豆瓣電影top250)

基本格式 縮進 使用4個空格進行縮進 行寬 每行代碼盡量不超過80個字符 理由&#xff1a; 這在查看side-by-side的diff時很有幫助方便在控制臺下查看代碼太長可能是設計有缺陷換行 Python支持括號內的換行。這時有兩種情況。 第二行縮進到括號的起始處foo long_function_name(v…

程序員的浪漫

程序員的浪漫 馬上就到520了&#xff0c;各位小伙伴想好了準備什么禮物送個自己的另一半呢&#xff1f;還沒想好的注意啦&#xff01;&#xff01;現在還有機會&#xff0c;今天給大家分享一些程序員的浪漫創意禮物&#xff0c;希望你可以從中找到一些靈感。 One Link&#xff…

14-1 部署項目

1313轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/9011671.html

The listener supports no services

$ lsnrctl start 報錯提示: The listener supports no services The command completed successfully 如圖所示&#xff1a; 這樣啟動后遠程連接會報錯&#xff1a; oracle ORA-12514:TNS:listener does not currently know of service requested in connect descriptor 問題原…

Luogu P2577 [ZJOI2005]午餐

一道貪心類背包DP的好題 首先發現一個十分顯然的性質&#xff0c;沒有這個性質整道題目都難以下手&#xff1a; 無論兩隊的順序如何&#xff0c;總是讓吃飯慢的人先排隊 這是一個很顯然的貪心&#xff0c;因為如果讓吃飯慢的排在后面要更多的時間至少沒有這樣優 因此我們先按吃…

SEO【總結】by 2019年5月

2019獨角獸企業重金招聘Python工程師標準>>> 關鍵點&#xff1a; 1、代碼 1.1、seo前端代碼&#xff1a;基于Html代碼的SEOherf&#xff1a;https://my.oschina.net/u/2862573/blog/3030664 注意的要點&#xff1a; h1&#xff0c;h2的內容很關鍵 網頁的壓縮、靜態化…

Linux 系統的啟動順序

第一步&#xff1a;加載BIOS當你打開ia計算機的電源&#xff0c;計算機會首先加載計算機主板的BIOS信息&#xff0c;因為它包含了CPU的相關信息&#xff0c;設備啟動順序[安裝系統的U盤啟動順序]&#xff0c;內存信息&#xff0c;時鐘信息&#xff0c;PnP特性等等&#xff0c; …

Oracle數據庫 查看表是否是 索引組織表的方法

1. 最近在工作過程中發現 一個表插入很慢 以為是索引組織表, 所以一直有點糾結 但是發現 產品里面是沒有IOT的 于是找了下公司的OCP 問了下 如何查看 就是 user_tables 視圖里面的一個字段. 見圖: 轉載于:https://www.cnblogs.com/jinanxiaolaohu/p/9018037.html

Windows server 2016 搭建RDS服務

計算機的更新換代太快&#xff0c;新購置的計算機沒幾年便覺得運行速度越來越慢&#xff0c;尤其是在運行一些比較大的應用程序是&#xff0c;用戶總是抱怨運行速度太慢或者總是死機等問題。如果要更換新的計算機&#xff0c;又得不到領導的批準&#xff0c;因此對于企業來說&a…

π 的定義(極限)

圓周率&#xff0c;周長&#xff08;2πr&#xff09;與直徑&#xff08;2r&#xff09;的比值。在名稱上&#xff0c;是通過計算命名的。 1. 劉徽割圓與圓周率 π 通過圓內接正多邊形的周長來計算圓周長&#xff0c;是三世紀中期我國魏晉時代的數學家劉徽的光輝思想。 對于圓內…

前端開發瀏覽器兼容問題

csshack 1234567我很少使用hacker的&#xff0c;可能是個人習慣吧&#xff0c;我不喜歡寫的代碼IE不兼容&#xff0c;然后用hack來解決。不過hacker還是非常好用的。使用hacker我可以把瀏覽器分為3類&#xff1a;IE6 &#xff1b;IE7和遨游&#xff1b;其他&#xff08;IE8 chr…

springboot2.0 多數據源整合問題 At least one JPA metamodel must be present! ??at

2019獨角獸企業重金招聘Python工程師標準>>> 數據源代碼&#xff1a; 第一個讀取配置文件代碼&#xff1a; package com.datasource;import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.sp…

好書推薦

阿爾花剌子模:代數學. 喬治波利亞:怎樣解題:數學思維的新方法. Anany Levitin:算法設計與分析基礎.轉載于:https://www.cnblogs.com/mtl6906/p/7625290.html

docker實戰系列之搭建rabbitmq

1.搜索鏡像【注&#xff1a;因為我這里采用的是阿里云鏡像加速器,所以我直接在阿里云中搜索相關鏡像路徑】,點擊"詳情"查看公網拉取路徑 2.拉取鏡像 docker pull registry.cn-hangzhou.aliyuncs.com/jc/rabbitmq-3 3.查看拉取的鏡像 docker images 4.創建并運行容器【…

【hdu 6038】Function

【Link】:http://codeforces.com/contest/834/problem/C 【Description】 給你兩個排列a和b; a排列的長度為n,b排列的長度為m; a∈[0..n-1],b∈[0..m-1]; 然后讓你求一個函數f[i]; f[i]的定義域為0..n-1,值域為0..m-1 同時使得對于任意f[i],i∈[0..n-1]; f(i)bf(a[i])成…