Acwing 1082 數字遊戲

2022-06-28 19:12:10 字數 1126 閱讀 7523

數字 dp 問題往往都是這樣的題型,給定乙個閉區間\([l,r]\),讓你求這個區間中滿足某種條件的數的總數。

字首和思想,轉化為\(f([0,r])-f([0,l-1])\)求解。

轉化成求\(f(n)\),將上限n轉化成10進製(根據題意轉化為k進製,一般是十進位制),列舉從最高位開始列舉n的10進製的每一位,只要該位的取值小於n的10進製對應位的取值,那麼這個數必然小於等於n。

一般使用dfs求解。

inline int dfs(int pos,int pre,bool limit,bool lead)一般要記錄當前在處理哪一位,當前位前一位的相關資訊,當前位是否有上限限制,當前位是否有前導0限制(最高位不能取0)

//limit向下一位傳遞的條件

limit==1&&i==a[pos] //當前位有限制,並且當前位取到了限制下的最大值

//lead向下一位傳遞的條件

lead==1&&i==0 //當前位有前導0限制(當前位不能取0),並且當前位取的就是0

求[x,y]中的數,滿足數字從左到右非下降關係的數的個數,如:123,445.

數字dp經典題。

字首和思想,轉化為\(f([0,r])-f([0,l-1])\)求解。

轉化成求\(f(n)\),將上限n轉化成10進製(根據題意轉化為k進製,一般是十進位制),列舉從最高位開始列舉n的10進製的每一位,只要該位的取值小於n的10進製對應位的取值,那麼這個數必然小於等於n。

#include using namespace std;

//f[i][j]表示前i位,第i+1位為j時的滿足條件的數的總數

//同時充當標記陣列,dfs使用記憶化搜尋,一般將f初始化為-1,遞迴過程中如果出現f[i][j]!=-1,表示這個狀態已經搜尋過,直接返回答案

//本題只需要記錄乙個值(數的個數),如果乙個狀態需要記錄多個值,f陣列定義為結構體

int f[12][12];

int a[12];//用於儲存上限n的k進製下的每個數

inline int dfs(int pos,int pre,bool limit)

return 0;

}

AcWing 1082 數字遊戲

題目傳送門 include using namespace std const int n 20 int a n 數字分離的陣列 int dp n n dp pos pre 表示當前第pos位,pre是指前一位是什麼,這個因素制約了後面的取值個數 功能 統計 0 pos 之間答案 param pos...

題解 AcWing 1082 數字遊戲

link 定義不降數為從左到右各位數字呈非下降關係。求 a,b 之間有多少不降數。1 leq a leq b leq 2 1 把詢問差分,變為詢問 1,n 中不降數的個數。首先,我們可以 dp 出 x 位且最高位為 y 的不降數的個數 設 f 表示 i 位,且最高位為 j 的不降數的個數。計算的時候...

AcWing 1084 數字遊戲 II

題目描述 由於科協裡最近真的很流行數字遊戲。某人又命名了一種取模數,這種數字必須滿足各位數字之和 mod n為 0。現在大家又要玩遊戲了,指定乙個整數閉區間 a.b 問這個區間內有多少個取模數。輸入格式 輸入包含多組測試資料,每組資料佔一行。每組資料報含三個整數 a,b,n。輸出格式 對於每個測試資...