国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

最大子矩陣(openjudge noi-2.6基本算法之動(dòng)態(tài)規(guī)劃-1768)

這篇具有很好參考價(jià)值的文章主要介紹了最大子矩陣(openjudge noi-2.6基本算法之動(dòng)態(tài)規(guī)劃-1768)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

(1)題目

來(lái)源

OpenJudge - 1768:最大子矩陣

題目描述

已知矩陣的大小定義為矩陣中所有元素的和。給定一個(gè)矩陣,你的任務(wù)是找到最大的非空(大小至少是1 * 1)子矩陣。

比如,如下4 * 4的矩陣

?0????????-2????????-7????????0
?9?????? ? 2????????-6????????2
-4 ??????? 1 ?????? -4 ?????? 1
-1?????? ? 8? ?????? 0?????? -2

它的最大子矩陣是

?9???????? 2
-4 ????????1
-1 ????????8

?這個(gè)子矩陣的大小是15。

輸入格式

輸入是一個(gè)N * N的矩陣。輸入的第一行給出N (0 < N <= 100)。再后面的若干行中,依次(首先從左到右給出第一行的N個(gè)整數(shù),再?gòu)淖蟮接医o出第二行的N個(gè)整數(shù)……)給出矩陣中的N2個(gè)整數(shù),整數(shù)之間由空白字符分隔(空格或者空行)。已知矩陣中整數(shù)的范圍都在[-127, 127]。

輸出格式

輸出最大子矩陣的大小。

輸入樣例

?4

?0????????-2????????-7????????0
?9?????? ? 2????????-6????????2
-4 ??????? 1 ?????? -4 ?????? 1
-1?????? ? 8? ?????? 0?????? -2

輸出樣例

15

(2)思路

1. 分析問(wèn)題:分析已知和未知

這道題和最大子段和有所相同,但變成二維的了,推薦看這道題題解的小伙伴們先去看一下我的另一篇題解——最大子段和

最大子段和(洛谷--P1115)-CSDN博客

我們將進(jìn)行以下幾步:a. 枚舉;b. 前綴和。

最大子矩陣(openjudge noi-2.6基本算法之動(dòng)態(tài)規(guī)劃-1768),算法,動(dòng)態(tài)規(guī)劃進(jìn)入分析環(huán)節(jié)最大子矩陣(openjudge noi-2.6基本算法之動(dòng)態(tài)規(guī)劃-1768),算法,動(dòng)態(tài)規(guī)劃

a. 枚舉

你以為我們會(huì)枚舉四個(gè)頂點(diǎn)一個(gè)頂點(diǎn)和矩陣長(zhǎng)寬左上頂點(diǎn)和右下頂點(diǎn)嗎?

錯(cuò)?。?!你想想那要寫(xiě)多少層循環(huán)?。?!

如果真那么寫(xiě),會(huì)是這樣(從舉的例子中可見(jiàn),枚舉左上頂點(diǎn)和右下頂點(diǎn)的時(shí)間復(fù)雜度應(yīng)該少一點(diǎn),那就枚舉左上頂點(diǎn)和右下頂點(diǎn)得到所有子矩陣,求和再比較)

#include<iostream>
using namespace std;
int main()
{
	int n,a[105][105],maxi=-130;//矩陣中整數(shù)的范圍都在[-127, 127],maxi=-130
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++) cin>>a[i][j]; //熟人 
	} 
	for(int x1=1;x1<=n;x1++)
	{
		for(int y1=1;y1<=n;y1++)//枚舉左上頂點(diǎn) 
		{
			for(int x2=x1;x2<=n;x2++)
			{
				for(int y2=y1;y2<=n;y2++)//枚舉右下頂點(diǎn) 
				{
					int sum=0;
					for(int i=x1;i<=x2;i++)
					{
						for(int j=y1;j<=y2;j++) sum+=a[i][j];//求和 
					}
					maxi=max(sum,maxi);//比較,求最大值 
				}
			}
		}
	}
	cout<<maxi; 
	return 0;
}

?你說(shuō)這超不超時(shí)。

看來(lái),只枚舉是不行了

b. 前綴和

根據(jù)最大子段和的思路,我們可以先求出第一行第一列到剩下每個(gè)位置的子矩陣的和,再通過(guò)拼圖的思路求和

for(int i=1;i<=n;i++)

{

? ? ? ? for(int j=1;j<=n;j++)//枚舉各個(gè)位置

? ? ? ? {

? ? ? ? ? ? ? ? for(int m=1;m<=i;m++)//枚舉第一行第一列到此位置的子矩陣

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? for(int n=1;n<=j;n++) f[i][j]+=a[x][y];//求前綴和

? ? ? ? ? ? ? ? }
? ? ? ? }
}//求前綴和

拼圖的思路作圖如下

最大子矩陣(openjudge noi-2.6基本算法之動(dòng)態(tài)規(guī)劃-1768),算法,動(dòng)態(tài)規(guī)劃

假如,若要求紅框內(nèi)矩陣的和,要用(1,1)到紅框內(nèi)矩陣的右下角的矩陣的和(藍(lán)框),減去剩下的部分,可以先減去橙框綠框,再把橙框綠框重疊的部分加回來(lái)(因?yàn)樗粶p了2次),就可以得到紅框內(nèi)矩陣的和了

修改內(nèi)容:

有沒(méi)有覺(jué)得4重循環(huán)還是多了?

前綴和的內(nèi)容還可以簡(jiǎn)化哦!

但簡(jiǎn)化后的內(nèi)容也要運(yùn)用拼圖思路

如圖所示

最大子矩陣(openjudge noi-2.6基本算法之動(dòng)態(tài)規(guī)劃-1768),算法,動(dòng)態(tài)規(guī)劃

?如果要求紅框矩陣內(nèi)的和,可以用(黃框+綠框-重疊部分+藍(lán)圈=紅框)的公式求和。

可以這樣做的原因是,黃框綠框以及重疊部分已經(jīng)求過(guò)了!?。≡偌由?span style="color:#4da8ee;">藍(lán)圈(a[i])就可以了。

具體代碼如下

for(int i=1;i<=n;i++)

{

????????for(int j=1;j<=n;j++)

????????{

????????????????f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];//拼圖思路
??????? }
}

2. 數(shù)據(jù)定義:已知和未知的取名和類型

n:輸入是一個(gè)N * N的矩陣

a[105][105]:輸入的矩陣,0 < n <= 100

f[105][105]:第一行第一列到剩下每個(gè)位置的子矩陣的和,0 < n <= 100

sum:所有子矩陣的和

maxi:所有子矩陣中最大和,矩陣中整數(shù)的范圍都在[-127, 127]

3. 數(shù)據(jù)輸入:輸入已知?

cin>>n;

for(int i=1;i<=n;i++)

{

? ? ? ? for(int j=1;j<=n;j++) cin>>a[i][j];

}

4. 數(shù)據(jù)計(jì)算:數(shù)字建模+設(shè)計(jì)算法

找前綴和的代碼在前面已經(jīng)給大家講過(guò)了,下面是拼圖的思路

for(int r1=1;r1<=n;r1++)

{

????????for(int c1=1;c1<=n;c1++)//枚舉左上頂點(diǎn)

? ? ? ? {

????????????????for(int r2=r1;r2<=n;r2++)

? ? ? ? ? ? ? ? {

????????????????????????for(int c2=c1;c2<=n;c2++)枚舉右下頂點(diǎn)

? ? ? ? ? ? ? ? ? ? ? ? {

????????????????????????????????sum=f[r2][c2]+f[r1-1][c1-1]-f[r1-1][c2]-f[r2][c1-1];//拼圖求和

????????????????????????????????maxi=max(maxi,sum);//比較

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sum=0;//清零

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }
? ? ? ? }
}文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-858894.html

(3)完整AC代碼

#include<iostream>
using namespace std;
int main()
{
	int f1[105][105]={0};
	int n,a[105][105],f[105][105]={0},sum=0,maxi=-0x3f3f3f3f;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++) cin>>a[i][j];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];
		}
	}
	for(int r1=1;r1<=n;r1++)
	{
		for(int c1=1;c1<=n;c1++)
		{
			for(int r2=r1;r2<=n;r2++)
			{
				for(int c2=c1;c2<=n;c2++)
				{
					sum=f[r2][c2]+f[r1-1][c1-1]-f[r1-1][c2]-f[r2][c1-1];
					maxi=max(maxi,sum);
					sum=0;
				}
			}
		}
	}
	cout<<maxi;
	return 0;
}

到了這里,關(guān)于最大子矩陣(openjudge noi-2.6基本算法之動(dòng)態(tài)規(guī)劃-1768)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)與算法】Kadane‘s算法(動(dòng)態(tài)規(guī)劃、最大子數(shù)組和)

    【數(shù)據(jù)結(jié)構(gòu)與算法】Kadane‘s算法(動(dòng)態(tài)規(guī)劃、最大子數(shù)組和)

    Kadane\\\'s 算法是一種用于解決最大子數(shù)組和問(wèn)題的動(dòng)態(tài)規(guī)劃算法。這類問(wèn)題的目標(biāo)是在給定整數(shù)數(shù)組中找到一個(gè)連續(xù)的子數(shù)組,使其元素之和最大(數(shù)組含有負(fù)數(shù))。 算法的核心思想是通過(guò)迭代數(shù)組的每個(gè)元素,維護(hù)兩個(gè)變量來(lái)跟蹤局部最優(yōu)解和全局最優(yōu)解。 以下是Kadane’s算

    2024年03月22日
    瀏覽(28)
  • 【算法思考記錄】動(dòng)態(tài)規(guī)劃入門!力扣2606. 找到最大開(kāi)銷的子字符串【Python3、動(dòng)態(tài)規(guī)劃】

    原題鏈接 動(dòng)態(tài)規(guī)劃(Dynamic Programming,簡(jiǎn)稱 DP)是一種通過(guò)將原問(wèn)題分解為相互重疊的子問(wèn)題并只解決一次的方法來(lái)解決問(wèn)題的算法優(yōu)化技術(shù)。動(dòng)態(tài)規(guī)劃通常用于優(yōu)化遞歸問(wèn)題,通過(guò)存儲(chǔ)子問(wèn)題的解來(lái)避免重復(fù)計(jì)算,從而顯著提高算法的效率。 動(dòng)態(tài)規(guī)劃的基本思想是將原問(wèn)題

    2024年02月03日
    瀏覽(26)
  • 劍指offer(C++)-JZ47:禮物的最大價(jià)值(算法-動(dòng)態(tài)規(guī)劃)

    劍指offer(C++)-JZ47:禮物的最大價(jià)值(算法-動(dòng)態(tài)規(guī)劃)

    作者:翟天保Steven 版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處 題目描述: 在一個(gè)mtimes nm×n的棋盤的每一格都放有一個(gè)禮物,每個(gè)禮物都有一定的價(jià)值(價(jià)值大于 0)。你可以從棋盤的左上角開(kāi)始拿格子里的禮物,并每次向右或者向

    2024年02月05日
    瀏覽(26)
  • 【算法題】動(dòng)態(tài)規(guī)劃中級(jí)階段之跳躍游戲、最大子數(shù)組和、解碼方法

    【算法題】動(dòng)態(tài)規(guī)劃中級(jí)階段之跳躍游戲、最大子數(shù)組和、解碼方法

    動(dòng)態(tài)規(guī)劃(Dynamic Programming,簡(jiǎn)稱 DP)是一種解決多階段決策過(guò)程最優(yōu)化問(wèn)題的方法。它是一種將復(fù)雜問(wèn)題分解成重疊子問(wèn)題的策略,通過(guò)維護(hù)每個(gè)子問(wèn)題的最優(yōu)解來(lái)推導(dǎo)出問(wèn)題的最優(yōu)解。 動(dòng)態(tài)規(guī)劃的主要思想是利用已求解的子問(wèn)題的最優(yōu)解來(lái)推導(dǎo)出更大問(wèn)題的最優(yōu)解,從而

    2024年02月11日
    瀏覽(22)
  • 【算法】Maximize Grid Happiness 最大化網(wǎng)格幸福感 動(dòng)態(tài)規(guī)劃

    給你四個(gè)整數(shù) m、n、introvertsCount 和 extrovertsCount 。有一個(gè) m x n 網(wǎng)格,和兩種類型的人:內(nèi)向的人和外向的人。總共有 introvertsCount 個(gè)內(nèi)向的人和 extrovertsCount 個(gè)外向的人。 請(qǐng)你決定網(wǎng)格中應(yīng)當(dāng)居住多少人,并為每個(gè)人分配一個(gè)網(wǎng)格單元。 注意,不必 讓所有人都生活在網(wǎng)格中

    2024年02月11日
    瀏覽(26)
  • 最大子段和——用蠻力算法,分治策略,動(dòng)態(tài)規(guī)劃算法三種求法(C語(yǔ)言)

    最大子段和——用蠻力算法,分治策略,動(dòng)態(tài)規(guī)劃算法三種求法(C語(yǔ)言)

    目錄 一、題目 二、算法求解 1、蠻力算法 偽代碼 ?算法分析 程序 2、分治策略 偽代碼 算法分析 程序 3、動(dòng)態(tài)規(guī)劃算法 偽代碼 算法分析 程序 設(shè)A=a1,a2,...,an是n個(gè)整數(shù)的序列,稱ai,....,aj為該序列的連續(xù)子序列,其中1=i=j=n,子序列的元素之和稱為A的子段和: 例如,A=-2,11,-4,1

    2024年01月24日
    瀏覽(24)
  • 【動(dòng)態(tài)規(guī)劃】動(dòng)態(tài)規(guī)劃算法基本概念,原理應(yīng)用和示例代碼

    ?????????動(dòng)態(tài)規(guī)劃(Dynamic Programming,簡(jiǎn)稱DP)是一種解決多階段決策問(wèn)題的數(shù)學(xué)優(yōu)化方法。它將原問(wèn)題分解成若干個(gè)子問(wèn)題,通過(guò)解決子問(wèn)題只需解決一次并將結(jié)果保存下來(lái),從而避免了重復(fù)計(jì)算,提高了算法效率。 ? ? ? ? 通俗來(lái)講,動(dòng)態(tài)規(guī)劃算法是解決一類具有重疊

    2024年01月21日
    瀏覽(28)
  • 矩陣鏈乘法的動(dòng)態(tài)規(guī)劃算法_1

    矩陣鏈乘法的動(dòng)態(tài)規(guī)劃算法_1

    上次我們學(xué)習(xí)了rod-cutting 問(wèn)題的動(dòng)態(tài)規(guī)劃算法,初步了解求解動(dòng)態(tài)規(guī)劃過(guò)程的CRCC步驟,此步驟對(duì)于可以運(yùn)用動(dòng)態(tài)優(yōu)化的問(wèn)題非常有用,類似給大家提供了一套思維模板,讓我們能更系統(tǒng)的思考和解決問(wèn)題。本次我們將討論矩陣鏈乘法的動(dòng)態(tài)規(guī)劃算法。 矩陣乘法 在討論矩陣鏈

    2024年01月19日
    瀏覽(27)
  • 【動(dòng)態(tài)規(guī)劃】矩陣鏈乘法——算法設(shè)計(jì)與分析

    【動(dòng)態(tài)規(guī)劃】矩陣鏈乘法——算法設(shè)計(jì)與分析

    對(duì)于矩陣 U p × q U_{ptimes q} U p × q ? 和 V q × r V_{qtimes r} V q × r ? , Z p × r = U V Z_{ptimes r}=UV Z p × r ? = U V ,共需計(jì)算 p q r pqr pq r 次標(biāo)量乘法,時(shí)間復(fù)雜度為 Θ ( p q r ) Theta (pqr) Θ ( pq r ) 矩陣乘法滿足結(jié)合律,即 ( U V ) W = U ( V W ) (UV)W=U(VW) ( U V ) W = U ( VW ) ,選擇不同的結(jié)合

    2024年02月03日
    瀏覽(22)
  • 算法 矩陣最長(zhǎng)遞增路徑-(遞歸回溯+動(dòng)態(tài)規(guī)劃)

    ??途W(wǎng): BM61 求矩陣的最長(zhǎng)遞增路徑 解題思路: 1. 遍歷二維矩陣每個(gè)位置,max求出所有位置分別為終點(diǎn)時(shí)的最長(zhǎng)路徑 2. 求某個(gè)位置為終點(diǎn)的最長(zhǎng)路徑時(shí),使用動(dòng)態(tài)規(guī)劃dp對(duì)已經(jīng)計(jì)算出的位置進(jìn)行記錄 3. 處理某個(gè)位置的最長(zhǎng)路徑時(shí),如果dp[i][j]位置已有值,則直接返回即可,否則

    2024年02月07日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包