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

【動(dòng)態(tài)規(guī)劃】【 數(shù)位dp】2827. 范圍中美麗整數(shù)的數(shù)目

這篇具有很好參考價(jià)值的文章主要介紹了【動(dòng)態(tài)規(guī)劃】【 數(shù)位dp】2827. 范圍中美麗整數(shù)的數(shù)目。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

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

數(shù)位dp
動(dòng)態(tài)規(guī)劃匯總

LeetCode2827. 范圍中美麗整數(shù)的數(shù)目

給你正整數(shù) low ,high 和 k 。
如果一個(gè)數(shù)滿足以下兩個(gè)條件,那么它是 美麗的 :
偶數(shù)數(shù)位的數(shù)目與奇數(shù)數(shù)位的數(shù)目相同。
這個(gè)整數(shù)可以被 k 整除。
請你返回范圍 [low, high] 中美麗整數(shù)的數(shù)目。
示例 1:
輸入:low = 10, high = 20, k = 3
輸出:2
解釋:給定范圍中有 2 個(gè)美麗數(shù)字:[12,18]

  • 12 是美麗整數(shù),因?yàn)樗?1 個(gè)奇數(shù)數(shù)位和 1 個(gè)偶數(shù)數(shù)位,而且可以被 k = 3 整除。
  • 18 是美麗整數(shù),因?yàn)樗?1 個(gè)奇數(shù)數(shù)位和 1 個(gè)偶數(shù)數(shù)位,而且可以被 k = 3 整除。
    以下是一些不是美麗整數(shù)的例子:
  • 16 不是美麗整數(shù),因?yàn)樗荒鼙?k = 3 整除。
  • 15 不是美麗整數(shù),因?yàn)樗钠鏀?shù)數(shù)位和偶數(shù)數(shù)位的數(shù)目不相等。
    給定范圍內(nèi)總共有 2 個(gè)美麗整數(shù)。
    示例 2:
    輸入:low = 1, high = 10, k = 1
    輸出:1
    解釋:給定范圍中有 1 個(gè)美麗數(shù)字:[10]
  • 10 是美麗整數(shù),因?yàn)樗?1 個(gè)奇數(shù)數(shù)位和 1 個(gè)偶數(shù)數(shù)位,而且可以被 k = 1 整除。
    給定范圍內(nèi)總共有 1 個(gè)美麗整數(shù)。
    示例 3:
    輸入:low = 5, high = 5, k = 2
    輸出:0
    解釋:給定范圍中有 0 個(gè)美麗數(shù)字。
  • 5 不是美麗整數(shù),因?yàn)樗钠鏀?shù)數(shù)位和偶數(shù)數(shù)位的數(shù)目不相等。
    提示:
    0 < low <= high <= 109
    0 < k <= 20

數(shù)位dp

直接使用封裝類,枚舉類型char,最小值’0’,最大值’9’,結(jié)果類型:int。
狀態(tài)數(shù)量:400。
i1 = 奇數(shù)數(shù)數(shù)量-偶數(shù)位數(shù)量+10,取值范圍 ∈ \in [1,19]
i2 = 當(dāng)前數(shù)字%k
狀態(tài)壓縮:20*i1+i2

代碼

核心代碼


template<class ELE, class ResultType, ELE minEle, ELE maxEle>
class CLowUperr
{
public:

	CLowUperr(int iCustomStatusCount) :m_iCustomStatusCount(iCustomStatusCount)
	{
	}
	void Init(const ELE* pLower, const ELE* pHigh, int iNum)
	{
		m_vPre.assign(4, vector<ResultType>(m_iCustomStatusCount));
		if (iNum <= 0)
		{
			return;
		}
		InitPre(pLower, pHigh);
		iNum--;
		while (iNum--)
		{
			pLower++;
			pHigh++;
			vector<vector<ResultType>> dp(4, vector<ResultType>(m_iCustomStatusCount));
			OnInitDP(dp);
			//處理非邊界
			for (auto tmp = minEle; tmp <= maxEle; tmp++)
			{
				OnEnumOtherBit(dp[0], m_vPre[0], tmp);
			}
			//處理下邊界
			OnEnumOtherBit(dp[1], m_vPre[1], *pLower);
			for (auto tmp = *pLower + 1; tmp <= maxEle; tmp++)
			{
				OnEnumOtherBit(dp[0], m_vPre[1], tmp);
			}
			//處理上邊界
			OnEnumOtherBit(dp[2], m_vPre[2], *pHigh);
			for (auto tmp = minEle; tmp < *pHigh; tmp++)
			{
				OnEnumOtherBit(dp[0], m_vPre[2], tmp);
			}
			//處理上下邊界
			if (*pLower == *pHigh)
			{
				OnEnumOtherBit(dp[3], m_vPre[3], *pLower);
			}
			else
			{
				OnEnumOtherBit(dp[1], m_vPre[3], *pLower);
				for (auto tmp = *pLower + 1; tmp < *pHigh; tmp++)
				{
					OnEnumOtherBit(dp[0], m_vPre[3], tmp);
				}
				OnEnumOtherBit(dp[2], m_vPre[3], *pHigh);
			}
			m_vPre.swap(dp);
		}
	}
protected:
	const int m_iCustomStatusCount;
	void InitPre(const ELE* const pLower, const ELE* const pHigh)
	{
		for (ELE cur = *pLower; cur <= *pHigh; cur++)
		{
			int iStatus = 0;
			if (*pLower == cur)
			{
				iStatus = *pLower == *pHigh ? 3 : 1;
			}
			else if (*pHigh == cur)
			{
				iStatus = 2;
			}
			OnEnumFirstBit(m_vPre[iStatus], cur);
		}
	}

	virtual void OnEnumOtherBit(vector<ResultType>& dp, const vector<ResultType>& vPre, ELE curValue) = 0;

	virtual void OnEnumFirstBit(vector<ResultType>& vPre, const ELE curValue) = 0;
	virtual void OnInitDP(vector<vector<ResultType>>& dp)
	{

	}
	vector<vector<ResultType>> m_vPre;
};

class CMy : public CLowUperr<char, int, '0', '9'>
{
public:
	typedef  int ResultType;
	typedef  char ELE;
	CMy(int k) :CLowUperr<char, int, '0', '9'>(400), m_iK(k)
	{

	}
	virtual void OnEnumOtherBit(vector<ResultType>& dp, const vector<ResultType>& vPre, ELE curValue)
	{
		const int index = curValue - '0';
		for (int iPreMask = 0; iPreMask < m_iCustomStatusCount; iPreMask++)
		{
			const int preK = iPreMask % 20;
			const int pre01 = iPreMask / 20 ;
			const int k = (preK*10+index) % m_iK;
			int i01 = (index & 1) ? 1 : -1;
			if ((pre01 + i01 < 0) || (pre01 + i01 >= 20))
			{
				continue;
			}
			const int mask = Mask(pre01+i01-10, k);
			dp[mask] += vPre[iPreMask];
		}
	}

	virtual void OnEnumFirstBit(vector<ResultType>& vPre, const ELE curValue)
	{
		const int index = curValue - '0';
		const int k = index % m_iK;
		int i01 = (index & 1) ? 1 : -1;
		const int mask = Mask(i01,k);
		vPre[mask]++;
	}
	int Result()const
	{
		int iRet = 0;
		for (int status = 0; status < 4; status++)
		{
			iRet += m_vPre[status][200];
		}
		return iRet;
	}
protected:
	int Mask(int i01, int k) {	return (i01 + 10) * 20 + k;	}
	const int m_iK;
};
class Solution {
public:
	int numberOfBeautifulIntegers(int low, int high, int iK) {
		string strLow = std::to_string(low);
		string strHigh = std::to_string(high);
		int iRet = 0;
		const int len1 = strLow.length();
		const int len2 = strHigh.length();
		if (len1 == len2)
		{
			return Do(strLow, strHigh, iK);
		}
		iRet += Do(strLow, string(len1, '9'),iK);
		for (int i = len1 + 1; i < len2; i++)
		{
			iRet += Do("1" + string(i - 1, '0'), string(i, '9'), iK);
		}
		iRet += Do("1" + string(len2 - 1, '0'), strHigh, iK);
		return iRet;
	}
	int Do(const string strLow,const string& strHigh,int k)
	{
		CMy my(k);
		my.Init(strLow.data(), strHigh.data(), strLow.length());
		return my.Result();
	}
};

測試用例


template<class T, class T2>
void Assert(const T& t1, const T2& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}

}

int main()
{
	
	int low = 1, high = 10, k = 1;
	{
		low = 1, high = 10, k = 1;
		auto res = Solution().numberOfBeautifulIntegers(low, high, k);
		Assert(1, res);
	}
	{
		low = 5, high = 5, k = 2;
		auto res = Solution().numberOfBeautifulIntegers(low, high, k);
		Assert(0, res);
	}
	{
		low = 10, high = 20, k = 3;
		auto res = Solution().numberOfBeautifulIntegers(low, high, k);
		Assert(2, res);
	}
	
}

【動(dòng)態(tài)規(guī)劃】【 數(shù)位dp】2827. 范圍中美麗整數(shù)的數(shù)目,# 算法題,動(dòng)態(tài)規(guī)劃,算法,c++,美麗數(shù)字,范圍,數(shù)位dp,整除

擴(kuò)展閱讀

視頻課程

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

如何你想快

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

相關(guān)

下載

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

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

測試環(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ī)劃】【 數(shù)位dp】2827. 范圍中美麗整數(shù)的數(shù)目,# 算法題,動(dòng)態(tài)規(guī)劃,算法,c++,美麗數(shù)字,范圍,數(shù)位dp,整除文章來源地址http://www.zghlxwxcb.cn/news/detail-848273.html

到了這里,關(guān)于【動(dòng)態(tài)規(guī)劃】【 數(shù)位dp】2827. 范圍中美麗整數(shù)的數(shù)目的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • C++ 動(dòng)態(tài)規(guī)劃 數(shù)位統(tǒng)計(jì)DP 計(jì)數(shù)問題

    C++ 動(dòng)態(tài)規(guī)劃 數(shù)位統(tǒng)計(jì)DP 計(jì)數(shù)問題

    給定兩個(gè)整數(shù) a 和 b ,求 a 和 b 之間的所有數(shù)字中 0~9 的出現(xiàn)次數(shù)。 例如,a=1024,b=1032 ,則 a 和 b 之間共有 9 個(gè)數(shù)如下: 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出現(xiàn) 10 次,1 出現(xiàn) 10 次,2 出現(xiàn) 7 次,3 出現(xiàn) 3 次等等… 輸入格式 輸入包含多組測試數(shù)據(jù)。 每組測試數(shù)據(jù)占一

    2024年02月20日
    瀏覽(27)
  • 【數(shù)位dp】【動(dòng)態(tài)規(guī)劃】C++算法:233.數(shù)字 1 的個(gè)數(shù)

    【數(shù)位dp】【動(dòng)態(tài)規(guī)劃】C++算法:233.數(shù)字 1 的個(gè)數(shù)

    視頻算法專題 動(dòng)態(tài)規(guī)劃匯總 給定一個(gè)整數(shù) n,計(jì)算所有小于等于 n 的非負(fù)整數(shù)中數(shù)字 1 出現(xiàn)的個(gè)數(shù)。 示例 1: 輸入:n = 13 輸出:6 示例 2: 輸入:n = 0 輸出:0 提示: 0 = n = 10 9 本題比較簡單,主要講封裝類。m_vPre記錄上一位所有狀態(tài),程序結(jié)束時(shí),記錄的是最后一位的所有

    2024年01月16日
    瀏覽(26)
  • 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和記憶化搜索

    暫無。。。 暫無。。。 題目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ī)劃——數(shù)位

    動(dòng)態(tài)規(guī)劃——數(shù)位

    ”某一區(qū)間“滿足某種性質(zhì) 技巧1:[x,y]=f[y]-f[x-1]; 技巧2:樹; 模板如下: 例1:度的數(shù)量 分析: 例2、數(shù)字游戲 分析: 例3、 Windy數(shù) 如果要求dp(1567),由于第一個(gè)根節(jié)點(diǎn)的分叉左枝干是從1開始,那么就等于0-999都沒有算進(jìn)res里面 好好理解f的含義,例如f[3] [9]表示最高位為

    2024年02月04日
    瀏覽(13)
  • Leetcode 第 108 場雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動(dòng)態(tài)規(guī)劃)

    Leetcode 第 108 場雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動(dòng)態(tài)規(guī)劃) 題目 給你一個(gè)二進(jìn)制字符串 s ,你需要將字符串分割成一個(gè)或者多個(gè) 子字符串 ,使每個(gè)子字符串都是 美麗 的。 如果一個(gè)字符串滿足以下條件,我們稱它是 美麗 的: 它不包含前導(dǎo) 0 。 它是

    2024年02月15日
    瀏覽(23)
  • 動(dòng)態(tài)規(guī)劃(DP)入門——線性DP

    動(dòng)態(tài)規(guī)劃(DP)入門——線性DP

    在了解線性DP之前,我們首先要知道什么是動(dòng)態(tài)規(guī)劃,即為將一種復(fù)雜問題,分解成很多重疊的子問題,并通過子問題的解得到整個(gè)問題的解的算法。聽起來比較抽象,動(dòng)態(tài)規(guī)劃簡單來說就是確定問題的狀態(tài),通常題目都會(huì)提示,一般為“到第i個(gè)為止,xx為j(xx為k)的方案數(shù)/最

    2024年02月19日
    瀏覽(25)
  • 【動(dòng)態(tài)規(guī)劃】【子序列除重】【C++算法】1987不同的好子序列數(shù)目

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

    【動(dòng)態(tài)規(guī)劃】【狀態(tài)壓縮】【2次選擇】【廣度搜索】1494. 并行課程 II 動(dòng)態(tài)規(guī)劃匯總 給你一個(gè)二進(jìn)制字符串 binary 。 binary 的一個(gè) 子序列 如果是 非空 的且沒有 前導(dǎo) 0 (除非數(shù)字是 “0” 本身),那么它就是一個(gè) 好 的子序列。 請你找到 binary 不同好子序列 的數(shù)目。 比方說,

    2024年02月21日
    瀏覽(17)
  • 動(dòng)態(tài)規(guī)劃報(bào)告(樹形DP+概率DP

    動(dòng)態(tài)規(guī)劃報(bào)告(樹形DP+概率DP

    樹形 DP,即在樹上進(jìn)行的 DP。由于樹固有的遞歸性質(zhì),樹形 DP 一般都是遞歸進(jìn)行的。一般需要在遍歷樹的同時(shí)維護(hù)所需的信息 以一道題目為例 2022CCPC桂林站G Group Homework No, we don’t want group homework. It’s the place where 1+11 can be true. However, you are currently the leader of a group with three

    2024年02月12日
    瀏覽(22)
  • 美麗序列(Dp)

    傳送門 牛牛喜歡整數(shù)序列,他認(rèn)為一個(gè)序列美麗的定義是 1:每個(gè)數(shù)都在0到40之間 2:每個(gè)數(shù)都小于等于之前的數(shù)的平均值 具體地說:for each i, 1 = i N,? A[i] = (A[0] + A[1] + ... + A[i-1]) / i. 3:沒有三個(gè)連續(xù)的遞減的數(shù) 現(xiàn)在給你一個(gè)序列,每個(gè)元素是-1到40,你可以將序列中的-1修改

    2024年02月13日
    瀏覽(16)
  • 動(dòng)態(tài)規(guī)劃(DP)(算法筆記)

    動(dòng)態(tài)規(guī)劃(DP)(算法筆記)

    本文內(nèi)容基于《算法筆記》和官方配套練題網(wǎng)站“晴問算法”,是我作為小白的學(xué)習(xí)記錄,如有錯(cuò)誤還請?bào)w諒,可以留下您的寶貴意見,不勝感激。 動(dòng)態(tài)規(guī)劃(Dynamic Programming,DP)是一種用來解決一類最優(yōu)化問題的算法思想。簡單來說,動(dòng)態(tài)規(guī)劃將一個(gè)復(fù)雜的問題分解成若干個(gè)子

    2024年02月05日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包