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

【動(dòng)態(tài)規(guī)劃 狀態(tài)機(jī)dp 性能優(yōu)化】3098. 求出所有子序列的能量和

這篇具有很好參考價(jià)值的文章主要介紹了【動(dòng)態(tài)規(guī)劃 狀態(tài)機(jī)dp 性能優(yōu)化】3098. 求出所有子序列的能量和。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本文涉及知識(shí)點(diǎn)

動(dòng)態(tài)規(guī)劃 狀態(tài)機(jī)dp 性能優(yōu)化

LeetCode3098. 求出所有子序列的能量和

給你一個(gè)長(zhǎng)度為 n 的整數(shù)數(shù)組 nums 和一個(gè) 正 整數(shù) k 。
一個(gè)子序列的 能量 定義為子序列中 任意 兩個(gè)元素的差值絕對(duì)值的 最小值 。
請(qǐng)你返回 nums 中長(zhǎng)度 等于 k 的 所有 子序列的 能量和 。
由于答案可能會(huì)很大,將答案對(duì) 109 + 7 取余 后返回。
示例 1:
輸入:nums = [1,2,3,4], k = 3
輸出:4
解釋:
nums 中總共有 4 個(gè)長(zhǎng)度為 3 的子序列:[1,2,3] ,[1,3,4] ,[1,2,4] 和 [2,3,4] 。能量和為 |2 - 3| + |3 - 4| + |2 - 1| + |3 - 4| = 4 。
示例 2:
輸入:nums = [2,2], k = 2
輸出:0
解釋:
nums 中唯一一個(gè)長(zhǎng)度為 2 的子序列是 [2,2] 。能量和為 |2 - 2| = 0 。
示例 3:
輸入:nums = [4,3,-1], k = 2
輸出:10
解釋:
nums 總共有 3 個(gè)長(zhǎng)度為 2 的子序列:[4,3] ,[4,-1] 和 [3,-1] 。能量和為 |4 - 3| + |4 - (-1)| + |3 - (-1)| = 10 。

提示:
2 <= n == nums.length <= 50
-108 <= nums[i] <= 108
2 <= k <= n

動(dòng)態(tài)規(guī)劃(狀態(tài)機(jī)dp)初版

動(dòng)態(tài)規(guī)劃的狀態(tài) 表示

pre 表示已經(jīng)處理完前x個(gè)數(shù)組符合條件的數(shù)量,dp表示已經(jīng)處理完x+1數(shù)組符合條件的數(shù)量。

pre[i][j][end][len] 表示此子序列:
a,長(zhǎng)度為len。
b,以nums[end]結(jié)束。
c,nums[j]-nums[i]的差最小。如果多個(gè)(i,j)符合條件,取最小的。比如:{1,2,3}的(I,j)是{0,1}而不是{1,2}。
空間復(fù)雜度:O(nnnk)
dp類似。

動(dòng)態(tài)規(guī)劃的轉(zhuǎn)移方程

只需要從x 推導(dǎo)x+1,不需要推導(dǎo)x+2,x+3 ? \cdots ? ,如果硬要的話需要用前綴和(后綴和)?!?br> { d p = p r e 不選擇 n u m s [ x ] d p [ i ] [ j ] [ x ] [ l e n + 1 ] + = . . . e l s e 且 n u m s [ j ] ? n u m s [ i ] < = n u m s [ x ] ? n u m s [ e n d ] d p [ e n d ] [ x ] [ x ] [ l e n + 1 ] + = . . . e l s e \begin{cases} dp = pre && 不選擇nums[x] \\ dp[i][j][x][len+1] += ... && else 且 nums[j]-nums[i] <= nums[x]-nums[end] \\ dp[end][x][x][len+1] += ... else \\ \end{cases} ? ? ??dp=predp[i][j][x][len+1]+=...dp[end][x][x][len+1]+=...else??不選擇nums[x]elsenums[j]?nums[i]<=nums[x]?nums[end]?
時(shí)間復(fù)雜度:O(nnnkn) 估計(jì)超時(shí)
剪枝:
枚舉的時(shí)候確保 i < j ,且 j <= x。

動(dòng)態(tài)規(guī)劃+前綴和

拆分成若干個(gè)子問(wèn)題,假定序列存在(i,j),且此序列的能力為power = nums[j]-nums[i]。

動(dòng)態(tài)規(guī)劃的狀態(tài)表示

dp[len][end] 表示 子序列的長(zhǎng)度為len,最后一個(gè)元素是end。
空間復(fù)雜度:O(kn)

利用前綴和優(yōu)化 動(dòng)態(tài)規(guī)劃的轉(zhuǎn)移方程

枚舉end,end not ∈ \in (i,j) ,否則此序列的能量就不是nums[j]-nums[i]了。
{ o l d E n d ∈ [ 0 , e n d ) 且 n u m s [ e n d ] ? n u m s [ o l d E n d ] > p o w e r e n d < = i o e d E n d ∈ ( e n d , n ) 且 n u m s [ e n d ] ? n u m s [ o l d E n d ] > = p o w e r e n d > = j \begin{cases} oldEnd \in [0,end)且nums[end] -nums[oldEnd] > power && end <= i \\ oedEnd \in (end,n) 且 nums[end] -nums[oldEnd] >= power && end >=j \\ \end{cases} {oldEnd[0,end)nums[end]?nums[oldEnd]>poweroedEnd(end,n)nums[end]?nums[oldEnd]>=power??end<=iend>=j?

如果不利用前綴和優(yōu)先,時(shí)間復(fù)雜度:O(knn),利用前綴和優(yōu)化O(kn)。
總時(shí)間復(fù)雜度:O(knkn)。

動(dòng)態(tài)規(guī)劃的初始狀態(tài)

枚舉所有長(zhǎng)度為2

動(dòng)態(tài)規(guī)劃的填表順序

l e n = 3 n _{len=3}^{n} len=3n?

動(dòng)態(tài)規(guī)劃的返回值

len == k 且 end >=j 才是需要統(tǒng)計(jì)的子序列數(shù)量。

代碼

沒(méi)用前綴和優(yōu)化

理論上過(guò)不了,實(shí)際過(guò)了。

template<int MOD = 1000000007>
class C1097Int
{
public:
	C1097Int(long long llData = 0) :m_iData(llData% MOD)
	{

	}
	C1097Int  operator+(const C1097Int& o)const
	{
		return C1097Int(((long long)m_iData + o.m_iData) % MOD);
	}
	C1097Int& operator+=(const C1097Int& o)
	{
		m_iData = ((long long)m_iData + o.m_iData) % MOD;
		return *this;
	}
	C1097Int& operator-=(const C1097Int& o)
	{
		m_iData = (m_iData + MOD - o.m_iData) % MOD;
		return *this;
	}
	C1097Int  operator-(const C1097Int& o)
	{
		return C1097Int((m_iData + MOD - o.m_iData) % MOD);
	}
	C1097Int  operator*(const C1097Int& o)const
	{
		return((long long)m_iData * o.m_iData) % MOD;
	}
	C1097Int& operator*=(const C1097Int& o)
	{
		m_iData = ((long long)m_iData * o.m_iData) % MOD;
		return *this;
	}
	bool operator==(const C1097Int& o)const
	{
		return m_iData == o.m_iData;
	}
	bool operator<(const C1097Int& o)const
	{
		return m_iData < o.m_iData;
	}
	C1097Int pow(long long n)const
	{
		C1097Int iRet = 1, iCur = *this;
		while (n)
		{
			if (n & 1)
			{
				iRet *= iCur;
			}
			iCur *= iCur;
			n >>= 1;
		}
		return iRet;
	}
	C1097Int PowNegative1()const
	{
		return pow(MOD - 2);
	}
	int ToInt()const
	{
		return m_iData;
	}
private:
	int m_iData = 0;;
};

class Solution {
public:
	int sumOfPowers(vector<int>& nums, const int K) {
		m_c = nums.size();
		sort(nums.begin(), nums.end());		
		C1097Int<> biRet = 0;
		for (int i = 0; i < m_c; i++) {
			for (int j = i + 1; j < m_c; j++) {
				auto cur = Do(nums, i, j, K);
				biRet += cur;
				//std::cout << " i :" << i << " j:" << j << " " << cur.ToInt() <<  std::endl;
			}
		}
		return biRet.ToInt();
	}
	C1097Int<> Do(const vector<int>& nums,int i,int j, const int K) {
		const int iDiff = nums[j] - nums[i];
		vector<vector<C1097Int<>>> dp(K + 1, vector<C1097Int<>>(m_c));
		for (int end = 0; end <= i; end++) {
			for (int end1 = 0; end1 < end; end1++) {
				if (nums[end] - nums[end1] > iDiff) {
					dp[2][end] += 1;
				}
			}
		}
		dp[2][j] = 1;
	
		for (int len = 3; len <= K; len++) {
			for (int end = 0; end <= i; end++) {
				for (int end1 = 0; end1 < end; end1++) {
					if (nums[end] - nums[end1] > iDiff) {
						dp[len][end] += dp[len - 1][end1];
					}
				}
			}
			dp[len][j] = dp[len - 1][i];
			for (int end = j+1; end < m_c; end++) {
				for (int end1 = j; end1 < end; end1++) {
					if (nums[end] - nums[end1] >= iDiff) {
						dp[len][end] += dp[len - 1][end1];
					}
				}
			}
		}
		return std::accumulate(dp.back().begin() + j, dp.back().end(), C1097Int<>())*iDiff;
	}
	int m_c;
};

測(cè)試用例

int main()
{
	vector<int> nums;
	int k;
	
	{
		Solution sln;
		nums = { 6,14,4,13 }, k = 3;
		auto res = sln.sumOfPowers(nums, k);
		Assert(6, res);
	}
	{
		Solution sln;
		nums = { 1,2,3,4 }, k = 3;
		auto res = sln.sumOfPowers(nums, k);
		Assert(4, res);
	}
	{
		Solution sln;
		nums = { 4,3,-1 }, k = 2;
		auto res = sln.sumOfPowers(nums, k);
		Assert(10, res);
	}

	{
		Solution sln;
		nums = { 2,2 }, k = 2;
		auto res = sln.sumOfPowers(nums, k);
		Assert(0, res);
	}
	{
		Solution sln;
		nums = { 2,246006,496910,752786,1013762,1279948,1551454,1828436,2110982,2399316,2693558,2993942,3300640,3613766,3933442,4259696,4592656,4932556,5279494,5633522,5994678,6363102,6739028,7122528,7513792,7913044,8320394,8736004,9160062,9592750,10034184,10484602,10944108,11412852,11891048,12378822,12876346,13383746,13901098,14428528,14966126,15514010,16072380,16641300,17220904,17811360,18412850,19025600,19649778,20285440 }, k = 37;
		auto res = sln.sumOfPowers(nums, k);
		Assert(273504325, res);
	}
}

利用前綴和優(yōu)化:用時(shí)減少不到50%

template<int MOD = 1000000007>
class C1097Int
{
public:
	C1097Int(long long llData = 0) :m_iData(llData% MOD)
	{

	}
	C1097Int  operator+(const C1097Int& o)const
	{
		return C1097Int(((long long)m_iData + o.m_iData) % MOD);
	}
	C1097Int& operator+=(const C1097Int& o)
	{
		m_iData = ((long long)m_iData + o.m_iData) % MOD;
		return *this;
	}
	C1097Int& operator-=(const C1097Int& o)
	{
		m_iData = (m_iData + MOD - o.m_iData) % MOD;
		return *this;
	}
	C1097Int  operator-(const C1097Int& o)
	{
		return C1097Int((m_iData + MOD - o.m_iData) % MOD);
	}
	C1097Int  operator*(const C1097Int& o)const
	{
		return((long long)m_iData * o.m_iData) % MOD;
	}
	C1097Int& operator*=(const C1097Int& o)
	{
		m_iData = ((long long)m_iData * o.m_iData) % MOD;
		return *this;
	}
	bool operator==(const C1097Int& o)const
	{
		return m_iData == o.m_iData;
	}
	bool operator<(const C1097Int& o)const
	{
		return m_iData < o.m_iData;
	}
	C1097Int pow(long long n)const
	{
		C1097Int iRet = 1, iCur = *this;
		while (n)
		{
			if (n & 1)
			{
				iRet *= iCur;
			}
			iCur *= iCur;
			n >>= 1;
		}
		return iRet;
	}
	C1097Int PowNegative1()const
	{
		return pow(MOD - 2);
	}
	int ToInt()const
	{
		return m_iData;
	}
private:
	int m_iData = 0;;
};

class Solution {
public:
	int sumOfPowers(vector<int>& nums, const int K) {
		m_c = nums.size();
		sort(nums.begin(), nums.end());
		C1097Int<> biRet = 0;
		for (int i = 0; i < m_c; i++) {
			for (int j = i + 1; j < m_c; j++) {
				auto cur = Do(nums, i, j, K);
				biRet += cur;
				//std::cout << " i :" << i << " j:" << j << " " << cur.ToInt() <<  std::endl;
			}
		}
		return biRet.ToInt();
	}
	C1097Int<> Do(const vector<int>& nums, int i, int j, const int K) {
		const int iDiff = nums[j] - nums[i];
		vector<vector<C1097Int<>>> dp(K + 1, vector<C1097Int<>>(m_c));
		for (int end = 0; end <= i; end++) {
			for (int end1 = 0; end1 < end; end1++) {
				if (nums[end] - nums[end1] > iDiff) {
					dp[2][end] += 1;
				}
			}
		}
		dp[2][j] = 1;

		for (int len = 3; len <= K; len++) {
			int end1 = 0;
			C1097Int<> biRet = 0;
			for (int end = 0; end <= i; end++) {
				while ((end1 < end) && (nums[end] - nums[end1] > iDiff)) {
					biRet += dp[len - 1][end1];
					end1++;
				}
				dp[len ][end] = biRet;
			}
			dp[len][j] = dp[len - 1][i];
			C1097Int<> biRet2 = 0;
			for (int end = j + 1,end1=j ; end < m_c; end++) {
				while ((end1 < end) && (nums[end] - nums[end1] >= iDiff)) {
					biRet2 += dp[len - 1][end1];
					end1++;
				}
				dp[len][end] = biRet2;
			}
		}
		return std::accumulate(dp.back().begin() + j, dp.back().end(), C1097Int<>()) * iDiff;
	}
	int m_c;
};

【動(dòng)態(tài)規(guī)劃 狀態(tài)機(jī)dp 性能優(yōu)化】3098. 求出所有子序列的能量和,# 困難算法題,數(shù)據(jù)結(jié)構(gòu)與算法,動(dòng)態(tài)規(guī)劃,算法,力扣,c++,狀態(tài)機(jī)dp,前綴和,子序列

擴(kuò)展閱讀

視頻課程

有效學(xué)習(xí):明確的目標(biāo) 及時(shí)的反饋 拉伸區(qū)(難度合適),可以先學(xué)簡(jiǎn)單的課程,請(qǐng)移步CSDN學(xué)院,聽(tīng)白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成戰(zhàn)斗了,為老板分憂,請(qǐng)學(xué)習(xí)C#入職培訓(xùn)、C++入職培訓(xùn)等課程
https://edu.csdn.net/lecturer/6176

相關(guān)下載

想高屋建瓴的學(xué)習(xí)算法,請(qǐng)下載《喜缺全書算法冊(cè)》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想對(duì)大家說(shuō)的話
聞缺陷則喜是一個(gè)美好的愿望,早發(fā)現(xiàn)問(wèn)題,早修改問(wèn)題,給老板節(jié)約錢。
子墨子言之:事無(wú)終始,無(wú)務(wù)多業(yè)。也就是我們常說(shuō)的專業(yè)的人做專業(yè)的事。
如果程序是一條龍,那算法就是他的是睛

測(cè)試環(huán)境

操作系統(tǒng):win7 開(kāi)發(fā)環(huán)境: VS2019 C++17
或者 操作系統(tǒng):win10 開(kāi)發(fā)環(huán)境: VS2022 C++17
如無(wú)特殊說(shuō)明,本算法用**C++**實(shí)現(xiàn)。

【動(dòng)態(tài)規(guī)劃 狀態(tài)機(jī)dp 性能優(yōu)化】3098. 求出所有子序列的能量和,# 困難算法題,數(shù)據(jù)結(jié)構(gòu)與算法,動(dòng)態(tài)規(guī)劃,算法,力扣,c++,狀態(tài)機(jī)dp,前綴和,子序列文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-859919.html

到了這里,關(guān)于【動(dòng)態(tài)規(guī)劃 狀態(tài)機(jī)dp 性能優(yōu)化】3098. 求出所有子序列的能量和的文章就介紹完了。如果您還想了解更多內(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)文章

  • 【算法優(yōu)選】 動(dòng)態(tài)規(guī)劃之簡(jiǎn)單多狀態(tài)dp問(wèn)題——貳

    動(dòng)態(tài)規(guī)劃相關(guān)題目都可以參考以下五個(gè)步驟進(jìn)行解答: 狀態(tài)表示 狀態(tài)轉(zhuǎn)移?程 初始化 填表順序 返回值 后面題的解答思路也將按照這五個(gè)步驟進(jìn)行講解。 給定一個(gè)整數(shù)數(shù)組prices,其中第 prices[i] 表示第 i 天的股票價(jià)格 設(shè)計(jì)一個(gè)算法計(jì)算出最大利潤(rùn)。在滿足以下約束條件下,

    2024年04月12日
    瀏覽(24)
  • 算法沉淀 —— 動(dòng)態(tài)規(guī)劃篇(簡(jiǎn)單多狀態(tài)dp問(wèn)題下)

    算法沉淀 —— 動(dòng)態(tài)規(guī)劃篇(簡(jiǎn)單多狀態(tài)dp問(wèn)題下)

    幾乎所有的動(dòng)態(tài)規(guī)劃問(wèn)題大致可分為以下5個(gè)步驟,后續(xù)所有問(wèn)題分析都將基于此 1.、狀態(tài)表示:通常狀態(tài)表示分為基本分為以下兩種,其中更是以第一種為甚。 以i為結(jié)尾 ,dp[i] 表示什么,通常為代求問(wèn)題(具體依題目而定) 以i為開(kāi)始 ,dp[i]表示什么,通常為代求問(wèn)題(具

    2024年04月16日
    瀏覽(23)
  • acwing算法基礎(chǔ)之動(dòng)態(tài)規(guī)劃--數(shù)位統(tǒng)計(jì)DP、狀態(tài)壓縮DP、樹形DP和記憶化搜索

    acwing算法基礎(chǔ)之動(dòng)態(tài)規(guī)劃--數(shù)位統(tǒng)計(jì)DP、狀態(tài)壓縮DP、樹形DP和記憶化搜索

    暫無(wú)。。。 暫無(wú)。。。 題目1 :求a~b中數(shù)字0、數(shù)字1、…、數(shù)字9出現(xiàn)的次數(shù)。 思路:先計(jì)算1~a中每位數(shù)字出現(xiàn)的次數(shù),然后計(jì)算1~b-1中每位數(shù)字出現(xiàn)的次數(shù),兩個(gè)相減即是最終答案。 那么,如何計(jì)算1~a中每位數(shù)字出現(xiàn)的次數(shù)呢? 首先,將a的每一位存入向量num中,例如a=123

    2024年02月04日
    瀏覽(23)
  • 【動(dòng)態(tài)規(guī)劃】簡(jiǎn)單多狀態(tài)dp問(wèn)題(1)打家劫舍問(wèn)題

    【動(dòng)態(tài)規(guī)劃】簡(jiǎn)單多狀態(tài)dp問(wèn)題(1)打家劫舍問(wèn)題

    打家劫舍問(wèn)題 傳送門:面試題 17.16. 按摩師 題目: 1.1 題目解析 越難的dp問(wèn)題,看示例只能起到了解題目的效果,一般推不出啥普遍的規(guī)律,所以接下來(lái)就是我們的算法原理,通過(guò)動(dòng)歸的思想去理解,才會(huì)豁然開(kāi)朗! 1.2 算法原理 1.2.1 狀態(tài)表示 我們需要通過(guò)經(jīng)驗(yàn) + 題目要求去

    2024年02月12日
    瀏覽(19)
  • 動(dòng)態(tài)規(guī)劃——斜率優(yōu)化DP 學(xué)習(xí)筆記

    動(dòng)態(tài)規(guī)劃——斜率優(yōu)化DP 學(xué)習(xí)筆記

    適用于求解最優(yōu)解(最大、最?。﹩?wèn)題。 可以將轉(zhuǎn)移方程可以化為 (left[begin{array}{rl} 僅與 space i space 有關(guān) 是我們想要最大/最小化的 \\\\ 僅與 space j space 有關(guān) 是已知的 \\\\ 與 space i space 和 space j space 都有關(guān) 是兩項(xiàng)相乘 end{array}right]) 三部分的, 都可以考慮用斜率優(yōu)化

    2024年02月08日
    瀏覽(19)
  • 動(dòng)態(tài)規(guī)劃——矩陣優(yōu)化DP 學(xué)習(xí)筆記

    前置知識(shí):矩陣、矩陣乘法。 斐波那契數(shù)列 在斐波那契數(shù)列當(dāng)中, (f_1 = f_2 = 1) , (f_i = f_{i - 1} + f_{i - 2}) ,求 (f_n) 。 而分析式子可以知道,求 (f_k) 僅與 (f_{k - 1}) 和 (f_{k - 2}) 有關(guān); 所以我們?cè)O(shè)矩陣 (F_i = begin{bmatrix} f_{i - 1} f_{i - 2} end{bmatrix}) 。 設(shè)矩陣 (text{Ba

    2024年02月08日
    瀏覽(25)
  • 【狀態(tài)機(jī)dp 動(dòng)態(tài)規(guī)劃】100290. 使矩陣滿足條件的最少操作次數(shù)

    【狀態(tài)機(jī)dp 動(dòng)態(tài)規(guī)劃】100290. 使矩陣滿足條件的最少操作次數(shù)

    動(dòng)態(tài)規(guī)劃匯總 狀態(tài)機(jī)dp 給你一個(gè)大小為 m x n 的二維矩形 grid 。每次 操作 中,你可以將 任一 格子的值修改為 任意 非負(fù)整數(shù)。完成所有操作后,你需要確保每個(gè)格子 grid[i][j] 的值滿足: 如果下面相鄰格子存在的話,它們的值相等,也就是 grid[i][j] == grid[i + 1][j](如果存在)

    2024年04月24日
    瀏覽(23)
  • 【動(dòng)態(tài)規(guī)劃專欄】專題三:簡(jiǎn)單多狀態(tài)dp--------3.刪除并獲得點(diǎn)數(shù)

    【動(dòng)態(tài)規(guī)劃專欄】專題三:簡(jiǎn)單多狀態(tài)dp--------3.刪除并獲得點(diǎn)數(shù)

    本專欄內(nèi)容為:算法學(xué)習(xí)專欄,分為優(yōu)選算法專欄,貪心算法專欄,動(dòng)態(tài)規(guī)劃專欄以及遞歸,搜索與回溯算法專欄四部分。 通過(guò)本專欄的深入學(xué)習(xí),你可以了解并掌握算法。 ??博主csdn個(gè)人主頁(yè):小小unicorn ?專欄分類:動(dòng)態(tài)規(guī)劃專欄 ??代碼倉(cāng)庫(kù):小小unicorn的代碼倉(cāng)庫(kù)??

    2024年03月22日
    瀏覽(26)
  • AcWing算法學(xué)習(xí)筆記:動(dòng)態(tài)規(guī)劃(背包 + 線性dp + 區(qū)間dp + 計(jì)數(shù)dp + 狀態(tài)壓縮dp + 樹形dp + 記憶化搜索)

    AcWing算法學(xué)習(xí)筆記:動(dòng)態(tài)規(guī)劃(背包 + 線性dp + 區(qū)間dp + 計(jì)數(shù)dp + 狀態(tài)壓縮dp + 樹形dp + 記憶化搜索)

    算法 復(fù)雜度 時(shí)間復(fù)雜度0(nm) 空間復(fù)雜度0(nv) 代碼 算法 通過(guò)滾動(dòng)數(shù)組對(duì)01背包樸素版進(jìn)行空間上的優(yōu)化 f[i] 與 f[i - 1]輪流交替 若體積從小到大進(jìn)行遍歷,當(dāng)更新f[i, j]時(shí),f[i - 1, j - vi] 已經(jīng)在更新f[i, j - vi]時(shí)被更新了 因此體積需要從大到小進(jìn)行遍歷,當(dāng)更新f[i, j]時(shí),f[i - 1,

    2024年02月21日
    瀏覽(21)
  • 15.動(dòng)態(tài)規(guī)劃:數(shù)據(jù)結(jié)構(gòu)優(yōu)化DP

    數(shù)據(jù)結(jié)構(gòu)優(yōu)化DP有前綴和、滑動(dòng)窗口、樹狀數(shù)組、線段樹、單調(diào)棧、單調(diào)隊(duì)列 中等 給你一個(gè)整數(shù)數(shù)組 nums ,找到其中最長(zhǎng)嚴(yán)格遞增子序列的長(zhǎng)度。 子序列 是由數(shù)組派生而來(lái)的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如, [3,6,2,7] 是數(shù)組 [0,3,1,6,2,2

    2024年02月03日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包