題目描述
傳送門題意:求0~n中含「49」的數的個數。
題解狀態:f[i][j]表示i位數所有以j開頭的數中合法(不含「49」)的數的個數。
轉移:if (j!=4||k!=9) f[i][j]+=f[i-1][k];列舉jk分別為i和i-1位數的開頭並且滿足條件。
求解時用總數減去dp值。
注意:這道題傳m+1的話有可能爆long long所以手動+1
**
#include
#include
#include
using
namespace
std;
#define ll long long
int t;
ll n,f[50][50],digit[50];
inline
void dp()
inline ll calc_ans(ll n)
return ans;
}int main()
}
題目描述
傳送門 題解
狀態:f[i][j]表示i位數所有以j開頭的數中合法(不含「4」「62」)的數的個數。
轉移:if (j!=4&&(j!=6||k!=2)) f[i][j]+=f[i-1][k];列舉jk分別為i和i-1位數的開頭並且滿足條件。
求解時字首和做差。
**
#include
#include
#include
using
namespace
std;
int n,m,f[10][20],digit[10];
inline
void dp()
inline
int calc_ans(int n)
return ans;
}int main()
}
題目描述
傳送門題意:求區間[a,b]內各個數字相加能被10整除的數的個數。題解
狀態:f(i,j)表示i位數,所有各個數字相加%10==j的數的個數。
轉移: f[i][j]+=f[i-1][(j+k)%10];
求解的時候注意:前面的數字會對後面的數字產生影響,所以在做後面的數字的時候要考慮到前面數字的和。
**
#include
#include
#include
using namespace std;
#define ll long long
ll t,n,m,mi[50],f[50][50],digit[50];
inline void dp()
inline ll calc_ans(ll n)
return ans;
}int main()
}
題目描述
傳送門題意:求區間[0,n]中所有能被13整除並且含「13」的數的個數。
題解狀態:f(i,j,k)表示i位數,mod 13==j, k=0 含「13」 k=1 不含「13」並且開頭不為「3」 k=2 不含「13」並且開頭為「3」 的數的個數
其實這種狀態的表示是比較經典的,並且前幾道題都可以用這種方式來dp,但是由於前幾道題比較簡單,用其他方法更好解決,但是這道題用這種方法就非常優越了。
轉移:基於
amod13+
bmod13≡
(a+b
)mod13(
mod13
) 進行轉移。
注意:由於前面的和會對後面產生影響,所以要維護乙個記錄和的量。細節比較繁瑣,具體看**。
**
#include
#include
#include
using namespace std;
int n,f[20][20][3],mi[20],digit[20];
inline void dp()
int a,amod,bmod;
for (int i=2;i<=10;++i)
for (int j=0;j<13;++j)
if (k==3) f[i][j][2]+=f[i-1][bmod][1]+f[i-1][bmod][2];} }
}inline int calc_ans(int n)
//如果前面已經符合條件,除去這一位所有的都可以加上
if (flag)
last+=mi[i-1]*digit[i];
continue;
}//如果上一位是1,這一位》3的話,要加上不含13但是開頭為3的
if (digit[i+1]==1&&digit[i]>3)
//如果這一位》1的話,要加上不含13但是開頭為3的
if (digit[i]>1)
if (digit[i]==3&&digit[i+1]==1) flag=true;
//最後加上這一位的數
last+=mi[i-1]*digit[i];
}return ans;
}int main()
學習筆記 訓練記錄 數字DP
數字dp,即對數字進行拆分,利用數字來轉移的一種dp,一般採用記憶化搜尋,或者是先預處理再進行轉移 乙個比較大略的思想就是可以對於給定的大數,進行按數字進行固定來轉移記錄答案 區間型別的,可以考慮字首和的思想,求 l,r 可以看做求 1,r 1,l 其實還有一種,是按照二進位制建一顆0,1樹來表示,...
HDU 3555 Bomb 基礎數字dp
題意大致就是說給你乙個數n,要你求0 n之間含有49的數的個數 理解題意很簡單下面就直接貼 了 include include include includeusing namespace std int64 dp 21 4 int a 1000 void init int main int g 0...
HDU 4734 基礎數字dp(遞推)
以前成都賽區的題目。題意很明顯,就是有乙個f x 的函式,然後給你乙個a和b求出在0 b中有多少小於等於f a 的,預處理出來dp i j k 中有多少小於等於k的。這裡採用遞推。因為我太弱了。遞迴總是寫錯。還需慢慢加深理解。ps.很醜。還是推薦遞迴。實在不會遞推也可以。蒟蒻加油!include i...