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

【動(dòng)態(tài)規(guī)劃】【子序列除重】【C++算法】1987不同的好子序列數(shù)目

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

作者推薦

【動(dòng)態(tài)規(guī)劃】【狀態(tài)壓縮】【2次選擇】【廣度搜索】1494. 并行課程 II

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

動(dòng)態(tài)規(guī)劃匯總

LeetCode1987:不同的好子序列數(shù)目

給你一個(gè)二進(jìn)制字符串 binary 。 binary 的一個(gè) 子序列 如果是 非空 的且沒有 前導(dǎo) 0 (除非數(shù)字是 “0” 本身),那么它就是一個(gè) 好 的子序列。
請(qǐng)你找到 binary 不同好子序列 的數(shù)目。
比方說,如果 binary = “001” ,那么所有 好 子序列為 [“0”, “0”, “1”] ,所以 不同 的好子序列為 “0” 和 “1” 。 注意,子序列 “00” ,“01” 和 “001” 不是好的,因?yàn)樗鼈冇星皩?dǎo) 0 。
請(qǐng)你返回 binary 中 不同好子序列 的數(shù)目。由于答案可能很大,請(qǐng)將它對(duì) 109 + 7 取余 后返回。
一個(gè) 子序列 指的是從原數(shù)組中刪除若干個(gè)(可以一個(gè)也不刪除)元素后,不改變剩余元素順序得到的序列。
示例 1:
輸入:binary = “001”
輸出:2
解釋:好的二進(jìn)制子序列為 [“0”, “0”, “1”] 。
不同的好子序列為 “0” 和 “1” 。
示例 2:
輸入:binary = “11”
輸出:2
解釋:好的二進(jìn)制子序列為 [“1”, “1”, “11”] 。
不同的好子序列為 “1” 和 “11” 。
示例 3:
輸入:binary = “101”
輸出:5
解釋:好的二進(jìn)制子序列為 [“1”, “0”, “1”, “10”, “11”, “101”] 。
不同的好子序列為 “0” ,“1” ,“10” ,“11” 和 “101” 。
提示:
1 <= binary.length <= 105
binary 只含有 ‘0’ 和 ‘1’ 。

動(dòng)態(tài)規(guī)劃

除0外,不存在以0開始的子序列。如果存在0,則必定存在子序列{0}。以下的分析排除{0}。
排除{0}后任意合法子序列在后面增加0或1,都是合法子序列。

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

pre[0] 從binary[0,i)中選擇若干字符,形成以0結(jié)束的合法子序列數(shù)量。pre[1]以1結(jié)束的子序列數(shù)量。
dp和pre類似,對(duì)應(yīng)的是binary[0,i+1)。

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

binary[i]為1

{ p r e [ 0 ] 不選擇當(dāng)前字符,以 0 結(jié)束的字符數(shù)量 情況一 p r e [ 1 ] 不選擇當(dāng)前字符,以 1 結(jié)束的字符數(shù) 情況二 p r e [ 0 ] + p r e [ 1 ] + 1 選擇當(dāng)前字符,以 1 結(jié)束的字符數(shù)量。 情況三 \begin{cases} pre[0] & 不選擇當(dāng)前字符,以0結(jié)束的字符數(shù)量 & 情況一 \\ pre[1] & 不選擇當(dāng)前字符,以1結(jié)束的字符數(shù) & 情況二 \\ pre[0]+pre[1]+1 & 選擇當(dāng)前字符,以1結(jié)束的字符數(shù)量。 & 情況三 \\ \end{cases} ? ? ??pre[0]pre[1]pre[0]+pre[1]+1?不選擇當(dāng)前字符,以0結(jié)束的字符數(shù)量不選擇當(dāng)前字符,以1結(jié)束的字符數(shù)選擇當(dāng)前字符,以1結(jié)束的字符數(shù)量。?情況一情況二情況三?
情況三又可以分三種情況:
{ p r e [ 0 ] 倒數(shù)第二個(gè)字符是 0 情況三一 p r e [ 1 ] 倒數(shù)第二個(gè)字符是 1 情況三二 1 子序列 1 。 情況三三 \begin{cases} pre[0] & 倒數(shù)第二個(gè)字符是0 & 情況三一 \\ pre[1] & 倒數(shù)第二個(gè)字符是1 & 情況三二 \\ 1 & 子序列{1}。 & 情況三三 \\ \end{cases} ? ? ??pre[0]pre[1]1?倒數(shù)第二個(gè)字符是0倒數(shù)第二個(gè)字符是1子序列1。?情況三一情況三二情況三三?
情況一、情況二、情況三 內(nèi)部不存在重復(fù)情況。
情況一以0結(jié)尾,情況二、三以1結(jié)尾,所以情況一和情況二(三)不會(huì)重復(fù)。
情況二所有的情況都和情況三重合,情況二分類:
{ 倒數(shù)第二個(gè)字符是 0 被情況三一包含 倒數(shù)第二個(gè)字符是 1 被情況三二包含 子序列 1 。 和情況三三重復(fù) \begin{cases} 倒數(shù)第二個(gè)字符是0 & 被情況三一包含 \\ 倒數(shù)第二個(gè)字符是1 & 被情況三二包含 \\ 子序列{1}。 & 和情況三三 重復(fù)\\ \end{cases} ? ? ??倒數(shù)第二個(gè)字符是0倒數(shù)第二個(gè)字符是1子序列1。?被情況三一包含被情況三二包含和情況三三重復(fù)?

總結(jié)
dp[1] = pre[0]+pre[1]+1
dp[0] = pre[0]

binary[i]為0

不能為子序列{0}
dp[0] = pre[0]+pre[1]
dp[1] = pre[1]

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

pre 全為0。

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

pre之和。

代碼

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;
	}
	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 numberOfUniqueGoodSubsequences(string binary) {
		vector<C1097Int<>> pre(2);
		for (const auto& ch : binary)
		{
			pre = {('0'==ch)? (pre[0] + pre[1]):pre[0],('1' == ch) ? (pre[0] + pre[1]+1) : pre[1] };
		}
		int iZero = std::count(binary.begin(), binary.end(), '0') > 0;
		return (pre[0] + pre[1] + iZero).ToInt();
	}
};

2023年2月

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

int operator+(int iData, const C1097Int& int1097)
{
int iRet = int1097.operator+(C1097Int(iData)).ToInt();
return iRet;
}

int& operator+=(int& iData, const C1097Int& int1097)
{
iData = int1097.operator+(C1097Int(iData)).ToInt();
return iData;
}

int operator*(int iData, const C1097Int& int1097)
{
int iRet = int1097.operator*(C1097Int(iData)).ToInt();
return iRet;
}

int& operator*=(int& iData, const C1097Int& int1097)
{
iData = int1097.operator*(C1097Int(iData)).ToInt();
return iData;
}

class Solution {
public:
int numberOfUniqueGoodSubsequences(string binary) {
vector pre(2);
for (const auto& ch : binary)
{
vector dp(2);
if (‘0’ == ch)
{
pre[0] += pre[1];
}
else
{
pre[1] += pre[0];
pre[1] += 1;
}
}
return (pre[0] + pre[1] + (int)(-1 != binary.find(‘0’))).ToInt();
}
};

2023年7月

class Solution {
public:
int numberOfUniqueGoodSubsequences(string binary) {
bool bHasZero = binary[0] == ‘0’;
vector<C1097Int<>> pre(2);
pre[1] = (binary[0] == ‘1’);
for (int i = 1; i < binary.size(); i++)
{
vector<C1097Int<>> dp = pre ;
if (‘0’ == binary[i])
{
bHasZero = true;
dp[0] = pre[0] + pre[1];
}
else
{
dp[1] = pre[0] + pre[1] + 1;
}
pre.swap(dp);
}
return (C1097Int<>(bHasZero) + pre[0] + pre[1]).ToInt();

}

};
【動(dòng)態(tài)規(guī)劃】【子序列除重】【C++算法】1987不同的好子序列數(shù)目,# 算法題,算法,動(dòng)態(tài)規(guī)劃,c++,力扣,數(shù)論,二進(jìn)制,數(shù)目

擴(kuò)展閱讀

視頻課程

有效學(xué)習(xí):明確的目標(biāo) 及時(shí)的反饋 拉伸區(qū)(難度合適),可以先學(xué)簡單的課程,請(qǐng)移步CSDN學(xué)院,聽白銀講師(也就是鄙人)的講解。
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ì)大家說的話
聞缺陷則喜是一個(gè)美好的愿望,早發(fā)現(xiàn)問題,早修改問題,給老板節(jié)約錢。
子墨子言之:事無終始,無務(wù)多業(yè)。也就是我們常說的專業(yè)的人做專業(yè)的事。
如果程序是一條龍,那算法就是他的是睛

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

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

【動(dòng)態(tài)規(guī)劃】【子序列除重】【C++算法】1987不同的好子序列數(shù)目,# 算法題,算法,動(dòng)態(tài)規(guī)劃,c++,力扣,數(shù)論,二進(jìn)制,數(shù)目文章來源地址http://www.zghlxwxcb.cn/news/detail-832295.html

到了這里,關(guān)于【動(dòng)態(tài)規(guī)劃】【子序列除重】【C++算法】1987不同的好子序列數(shù)目的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(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)文章

  • 代碼隨想錄 動(dòng)態(tài)規(guī)劃 判斷子序列,不同的子序列

    392. 判斷子序列 給定字符串? s ?和? t ?,判斷? s ?是否為? t ?的子序列。 字符串的一個(gè)子序列是原始字符串刪除一些(也可以不刪除)字符而不改變剩余字符相對(duì)位置形成的新字符串。(例如, \\\"ace\\\" 是 \\\"abcde\\\" 的一個(gè)子序列,而 \\\"aec\\\" 不是)。 思路: 1. 使用哈希統(tǒng)計(jì)兩個(gè)序

    2024年02月07日
    瀏覽(25)
  • 動(dòng)態(tài)規(guī)劃:子序列問題(C++)

    動(dòng)態(tài)規(guī)劃:子序列問題(C++)

    動(dòng)態(tài)規(guī)劃往期文章: 動(dòng)態(tài)規(guī)劃入門:斐波那契數(shù)列模型以及多狀態(tài) 動(dòng)態(tài)規(guī)劃:路徑和子數(shù)組問題 1.最長遞增子序列(中等) 鏈接 :最長遞增子序列 題目描述 做題步驟 狀態(tài)表示 對(duì)于線性dp,我們通常采用下面兩種表示: (1)以某個(gè)位置為結(jié)尾,…… (2)以某個(gè)位置為起點(diǎn),……

    2024年02月08日
    瀏覽(21)
  • 動(dòng)態(tài)規(guī)劃(子序列問題) 力扣 c++

    給定兩個(gè)字符串 text1 和 text2,返回這兩個(gè)字符串的最長 公共子序列 的長度。如果不存在 公共子序列 ,返回 0 。 一個(gè)字符串的 子序列 是指這樣一個(gè)新的字符串:它是由原字符串在不改變字符的相對(duì)順序的情況下刪除某些字符(也可以不刪除任何字符)后組成的新字符串。

    2024年02月11日
    瀏覽(14)
  • 算法:動(dòng)態(tài)規(guī)劃——最長公共子序列

    算法:動(dòng)態(tài)規(guī)劃——最長公共子序列

    動(dòng)態(tài)規(guī)劃算法與分治法類似,其基本思想也是將待求解問題分解成若干個(gè)子問題,先求解子問題,然后從這些子問題的解得到原問題的解。 與分治法不同的是,適合于用動(dòng)態(tài)規(guī)劃法求解的問題,經(jīng)分解得到的子問題往往不是互相獨(dú)立的。若用分治法解這類問題,則分解得到的

    2023年04月27日
    瀏覽(22)
  • 【算法-動(dòng)態(tài)規(guī)劃】最長公共子序列

    【算法-動(dòng)態(tài)規(guī)劃】最長公共子序列

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識(shí),也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年01月23日
    瀏覽(27)
  • 動(dòng)態(tài)規(guī)劃算法 | 最長遞增子序列

    動(dòng)態(tài)規(guī)劃算法 | 最長遞增子序列

    通過查閱相關(guān)資料 發(fā)現(xiàn)動(dòng)態(tài)規(guī)劃問題一般就是求解最值問題 。這種方法在解決一些問題時(shí)應(yīng)用比較多,比如求最長遞增子序列等。 有部分人認(rèn)為動(dòng)態(tài)規(guī)劃的核心就是:窮舉。因?yàn)橐笞钪?,肯定要把所有可行的答案窮舉出來,然后在其中找最值。 首先,筆者認(rèn)為動(dòng)態(tài)規(guī)劃中

    2024年02月06日
    瀏覽(30)
  • C++動(dòng)態(tài)規(guī)劃之最長上升子序列

    C++動(dòng)態(tài)規(guī)劃之最長上升子序列

    一個(gè)序列A={a1,a2,...an}中任意刪除若干項(xiàng),剩余的序列叫做A的一個(gè)子序列。例如序列A={1,3,5,4,2},刪除其中的第3項(xiàng)和第5項(xiàng),得到序列B={1,3,4},刪除其中的第3項(xiàng)和第4項(xiàng),得到序列C={1,3,2},此時(shí)序列B和C是序列A的子序列。 如果序列中的元素是從小到大排列的,則該序列為上升

    2023年04月14日
    瀏覽(25)
  • 算法沉淀 —— 動(dòng)態(tài)規(guī)劃(子序列問題(上))

    算法沉淀 —— 動(dòng)態(tài)規(guī)劃(子序列問題(上))

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

    2024年04月15日
    瀏覽(44)
  • 算法day39|動(dòng)態(tài)規(guī)劃:不同路徑Ⅰ、Ⅱ

    https://leetcode.cn/problems/unique-paths/ 了解下標(biāo)含義——這里是行列數(shù) 理解為什么dfs不能做這道題(超時(shí)) https://leetcode.cn/problems/unique-paths-ii/ 初始化時(shí)也應(yīng)該注意限制條件 注意特殊情況的判斷

    2024年02月06日
    瀏覽(21)
  • 算法D39 | 動(dòng)態(tài)規(guī)劃2 | 62.不同路徑 63. 不同路徑 II

    今天開始逐漸有?dp的感覺了,題目不多,就兩個(gè)?不同路徑,可以好好研究一下 62.不同路徑? 本題大家掌握動(dòng)態(tài)規(guī)劃的方法就可以。?數(shù)論方法?有點(diǎn)非主流,很難想到。? 代碼隨想錄 視頻講解: 動(dòng)態(tài)規(guī)劃中如何初始化很重要!| LeetCode:62.不同路徑_嗶哩嗶哩_bilibili 這個(gè)題看

    2024年04月10日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包