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

【洛谷】數(shù)字三角形(動(dòng)態(tài)規(guī)劃)

這篇具有很好參考價(jià)值的文章主要介紹了【洛谷】數(shù)字三角形(動(dòng)態(tài)規(guī)劃)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

邊讀邊存

優(yōu)化成一維數(shù)組——倒序沒(méi)用了?


【洛谷】數(shù)字三角形(動(dòng)態(tài)規(guī)劃),題解,數(shù)據(jù)結(jié)構(gòu)與算法,動(dòng)態(tài)規(guī)劃,算法

從上往下存,最大值存在最后一行,最后遍歷最后一行得到最大值的寫法?

邊讀邊存

邊讀邊存,可以有效降低時(shí)間復(fù)雜度

#include<iostream>
using namespace std;
int dp[1005][1005] = { 0 };
//dp[i][j]表示前面的路徑(包括dp[i][j]點(diǎn)本身)能取得的最大值

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
//由于題目數(shù)據(jù)量較大,上面兩行代碼可以加速35%左右
	int r, j = 0, cnt = 2, MAX = -1;
	cin >> r;
	cin >> dp[1][1];
//下面的內(nèi)層循環(huán)比較特殊,因?yàn)闃?shù)每往下一層,元素都遞增一個(gè)
//所以用cnt來(lái)記錄每層元素的個(gè)數(shù)
	for (int i = 2; i <= r; ++i)
	{
		while (++j <= cnt)
		{
			cin >> dp[i][j];
			dp[i][j] += max(dp[i - 1][j], dp[i - 1][j - 1]);
//由于是二叉樹(shù),因此每個(gè)節(jié)點(diǎn)只需判斷它前面兩個(gè)結(jié)點(diǎn)的值哪個(gè)最大即可
//因?yàn)槭菑膁p[1][1]開(kāi)始存入數(shù)據(jù),所以i-1和j-1均不會(huì)越界
		}
		++cnt;
		j = 0;
	}
	//遍歷最后一行判斷誰(shuí)是最大值
	for (int i = 1; i <= r; ++i)
	{
		MAX = max(MAX, dp[r][i]);
	}
	cout << MAX;
	return 0;
}

優(yōu)化成一維數(shù)組——倒序沒(méi)用了?

在上一篇文章(【洛谷】采藥(01背包問(wèn)題))將二維數(shù)組優(yōu)化成一維數(shù)組的過(guò)程中,內(nèi)層循環(huán)我們是采用倒序的方式計(jì)算dp[ i ][ j ],這是因?yàn)槿绻虼鎯?chǔ)dp[ i ][ j ],就會(huì)覆蓋掉dp[ i-1 ][ j ],這樣就無(wú)法通過(guò)狀態(tài)方程計(jì)算dp[ i ][ j ]。在這道題中同樣要避免覆蓋掉dp[ i-1 ][ j ],不過(guò)為了保證時(shí)間復(fù)雜度,必須保留邊讀邊存的做法。

接下來(lái)嘗試一下倒序的方式在這題中是否適用(這么問(wèn)了肯定不適用,正確答案請(qǐng)移步最后)

int r, j = 3, cnt = 2, MAX = -1;
	cin >> r;
	cin >> dp[1];
	for (int i = 2; i <= r; ++i)
	{
		while (--j >= 1)
		{
			cin >> dp[j];
			dp[j] += max(dp[j], dp[j - 1]);
		}
		++cnt;
		j = cnt;
	}

首先要注意一點(diǎn),我們是逆序輸入,也就是說(shuō)如果原來(lái)輸入 3,10,9,那么在數(shù)組的里存放的順序應(yīng)該是9,10,3(假設(shè)單純的存進(jìn)去,不進(jìn)行運(yùn)算)

那么輸入的樹(shù)應(yīng)該是鏡像的,比如

7

3 8

8 1 0

2 7 4 4

會(huì)變成:

? ? ? ? ?7

? ? ? 8 3

? ?0?1 8

4 4 7 2

這兩棵樹(shù)在這道題中其實(shí)沒(méi)有區(qū)別,因此不影響。

然后我們輸入下面這組數(shù)據(jù)

4
7
3 8
8 1 0
2 7 4 4

當(dāng)輸入到

4

7

3

時(shí),樹(shù)的結(jié)構(gòu)如下:

【洛谷】數(shù)字三角形(動(dòng)態(tài)規(guī)劃),題解,數(shù)據(jù)結(jié)構(gòu)與算法,動(dòng)態(tài)規(guī)劃,算法?

?接著輸入8之后,以下兩種情況,你覺(jué)得是哪一種?

【洛谷】數(shù)字三角形(動(dòng)態(tài)規(guī)劃),題解,數(shù)據(jù)結(jié)構(gòu)與算法,動(dòng)態(tài)規(guī)劃,算法

?是下面的那種??创a中下面這部分【洛谷】數(shù)字三角形(動(dòng)態(tài)規(guī)劃),題解,數(shù)據(jù)結(jié)構(gòu)與算法,動(dòng)態(tài)規(guī)劃,算法

在cin>>dp[1]的時(shí)候,已經(jīng)把dp[1]覆蓋成8了,因此公式變成了8+=max(8,0),這樣一來(lái)答案就錯(cuò)了。不過(guò)到這一步,怎么改錯(cuò)也很明顯了,既然不想被覆蓋,那就引入一個(gè)變量來(lái)保存一下原本的dp[ j ]就行了嘛。【洛谷】數(shù)字三角形(動(dòng)態(tài)規(guī)劃),題解,數(shù)據(jù)結(jié)構(gòu)與算法,動(dòng)態(tài)規(guī)劃,算法

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

#include<iostream>
using namespace std;
int dp[1005] = { 0 };

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	int r, j = 3, cnt = 2, MAX = -1, x = 0;
	cin >> r;
	cin >> dp[1];
	for (int i = 2; i <= r; ++i)
	{
		while (--j >= 1)
		{
			cin >> x;
			x += max(dp[j], dp[j - 1]);
			dp[j] = x;
		}
		++cnt;
		j = cnt + 1;
	}
	for (int i = 1; i <= r; ++i)
	{
		MAX = max(MAX, dp[i]);
	}
	cout << MAX;
	return 0;
}

于是空間成功從4MB多降到了800KB

當(dāng)然,還可以從下往上計(jì)算,最后的結(jié)果保存在dp[1][1],這樣減少了最后遍歷整個(gè)數(shù)組的過(guò)程,但是輸入的時(shí)候沒(méi)法實(shí)現(xiàn)邊讀邊存,最終時(shí)間復(fù)雜度沒(méi)有差別。這里引用一下原題下方大神linlin1024的題解

【洛谷】數(shù)字三角形(動(dòng)態(tài)規(guī)劃),題解,數(shù)據(jù)結(jié)構(gòu)與算法,動(dòng)態(tài)規(guī)劃,算法

?

到了這里,關(guān)于【洛谷】數(shù)字三角形(動(dòng)態(tài)規(guī)劃)的文章就介紹完了。如果您還想了解更多內(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ì)-數(shù)字三角形問(wèn)題(動(dòng)態(tài)規(guī)劃)(通俗易懂,附源碼和圖解,含時(shí)間復(fù)雜度分析)(c++)

    算法分析與設(shè)計(jì)-數(shù)字三角形問(wèn)題(動(dòng)態(tài)規(guī)劃)(通俗易懂,附源碼和圖解,含時(shí)間復(fù)雜度分析)(c++)

    (一)題目 問(wèn)題描述 給定一個(gè)由 n n n 行數(shù)字組成的數(shù)字三角形,如圖所示。 試設(shè)計(jì)一個(gè)算法,計(jì)算從三角形的頂至底的一條路徑,使該路徑經(jīng)過(guò)的數(shù)字總和最大。 算法設(shè)計(jì) 對(duì)于給定的由 n n n 行數(shù)字組成的數(shù)字三角形,計(jì)算從該三角形的頂至底的路徑經(jīng)過(guò)的數(shù)字和的最大值

    2023年04月10日
    瀏覽(29)
  • 力扣120. 三角形最小路徑和(Java 動(dòng)態(tài)規(guī)劃)

    力扣120. 三角形最小路徑和(Java 動(dòng)態(tài)規(guī)劃)

    Problem: 120. 三角形最小路徑和 Problem:64. 最小路徑和 本題目可以看作是在上述題目的基礎(chǔ)上改編而來(lái),具體的思路: 1.記錄一個(gè)int類型的大小的 n 乘 n n乘n n 乘 n 的數(shù)組(其中 n n n 為數(shù)組triangle的行數(shù))用于記錄 每一個(gè)當(dāng)前階段的最小路徑和 2.大體上可以依據(jù)題意得出動(dòng)態(tài)轉(zhuǎn)移

    2024年01月22日
    瀏覽(19)
  • 藍(lán)橋 卷“兔”來(lái)襲編程競(jìng)賽專場(chǎng)-03破解三角形密碼 題解

    挑戰(zhàn)介紹 三角形密碼指的是將一串字符串按照正直角三角形的形狀排列,傳遞的信息隱藏在每一行的最后一個(gè)字符,然后將所有的行的最后一個(gè)字符依次連接,就是需要傳遞的信息。 例如加密后的字符串是:我們愛(ài)的是藍(lán)色的心橋 將加密字符串按照正直角三角形填充后如下

    2023年04月16日
    瀏覽(19)
  • 【數(shù)字三角形】

    【數(shù)字三角形】

    題目描述 上圖給出了一個(gè)數(shù)字三角形。從三角形的頂部到底部有很多條不同的路徑。對(duì)于每條路徑,把路徑上面的數(shù)加起來(lái)可以得到一個(gè)和,你的任務(wù)就是找到最大的和。 路徑上的每一步只能從一個(gè)數(shù)走到下一層和它最近的左邊的那個(gè)數(shù)或者右 邊的那個(gè)數(shù)。此外,向左下走

    2024年02月05日
    瀏覽(23)
  • 【數(shù)字三角形】(C++版)

    【數(shù)字三角形】(C++版)

    題目描述 上圖給出了一個(gè)數(shù)字三角形。從三角形的頂部到底部有很多條不同的路徑。對(duì)于每條路徑,把路徑上面的數(shù)加起來(lái)可以得到一個(gè)和,你的任務(wù)就是找到最大的和。 路徑上的每一步只能從一個(gè)數(shù)走到下一層和它最近的左邊的那個(gè)數(shù)或者右 邊的那個(gè)數(shù)。此外,向左下走

    2024年02月16日
    瀏覽(32)
  • AcWing 898. 數(shù)字三角形 (每日一題)

    AcWing 898. 數(shù)字三角形 (每日一題)

    像數(shù)組下標(biāo) 出現(xiàn) i-1 的,在循環(huán)的時(shí)候從 i=1 開(kāi)始。 0x3f3f3f3f : 1061109567 Integer.MAX_VALUE : 2147483647 在選用 Integer.MAX_VALUE 時(shí),很可能會(huì)出現(xiàn) 數(shù)據(jù)溢出 。 所以在用 Integer.MAX_VALUE 時(shí) 需要先取 MAX 再加 a[i][j]; 注:做 數(shù)字三角形 這題時(shí), 初始化時(shí)需要注意一下邊界 。 由于我們 狀態(tài)計(jì)

    2024年02月11日
    瀏覽(23)
  • 數(shù)字三角形+包子湊數(shù)(藍(lán)橋杯JAVA解法)

    數(shù)字三角形+包子湊數(shù)(藍(lán)橋杯JAVA解法)

    題目描述 上圖給出了一個(gè)數(shù)字三角形。從三角形的頂部到底部有很多條不同的路徑。對(duì)于每條路徑,把路徑上面的數(shù)加起來(lái)可以得到一個(gè)和,你的任務(wù)就是找到最大的和(路徑上的每一步只可沿左斜線向下或右斜線向下走)。 輸入描述 輸入的第一行包含一個(gè)整數(shù)?N?(1≤N≤

    2024年02月01日
    瀏覽(18)
  • 藍(lán)橋杯第十一屆省賽——數(shù)字三角形(python組)

    藍(lán)橋杯第十一屆省賽——數(shù)字三角形(python組)

    題目:數(shù)字三角形 【問(wèn)題描述】: 上圖給出了一個(gè)數(shù)字三角形。從三角形的頂部到底部有很多條不同的路徑。對(duì)于每條路徑,把路徑上面的數(shù)加起來(lái)可以得到一個(gè)和,你的任務(wù)就是找到最 大的和。 路徑上的每一步只能從一個(gè)數(shù)走到下一層和它最近的左邊的那個(gè)數(shù)或者右 邊

    2023年04月10日
    瀏覽(24)
  • 湘大 XTU OJ 1148 三角形 題解(非常詳細(xì)):根據(jù)題意樸素模擬+觀察樣例分析需要計(jì)算幾輪 具體到一般

    湘大 XTU OJ 1148 三角形 題解(非常詳細(xì)):根據(jù)題意樸素模擬+觀察樣例分析需要計(jì)算幾輪 具體到一般

    1148 三角形 題目描述 給一個(gè)序列, 按下面的方式進(jìn)行三角形累加,求其和值 。 比如序列為 1,2,3,4,5 輸入 有多組樣例。每個(gè)樣例的第一行是一個(gè)整數(shù)N( 1≤N≤100 ),表示序列的大小, 如果N為0表示輸入結(jié)束。這個(gè)樣例不需要處理。 第二行是N個(gè)整數(shù),每個(gè)整數(shù)處于[0,100]之間。

    2024年02月13日
    瀏覽(32)
  • 【算法挨揍日記】day03——雙指針?biāo)惴╛有效三角形的個(gè)數(shù)、和為s的兩個(gè)數(shù)字

    【算法挨揍日記】day03——雙指針?biāo)惴╛有效三角形的個(gè)數(shù)、和為s的兩個(gè)數(shù)字

    ?? 611.?有效三角形的個(gè)數(shù) https://leetcode.cn/problems/valid-triangle-number/ 給定一個(gè)包含非負(fù)整數(shù)的數(shù)組? nums ?,返回其中可以組成三角形三條邊的三元組個(gè)數(shù)。 本題是一個(gè)關(guān)于三角形是否能成立的題目,首先我們假設(shè)三角形的三邊(a,b,c),我們要保證兩邊之和大于第三邊 ? ?題

    2024年02月12日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包