数位dp, 顾名思义 对数的位数进行操作。 一般 题目会与数的位数相关。
数位dp最重要的是其dp数组的确定,根据需要 可以确定多维dp数组, 一般dp数组的每一对下标 都只能唯一确定一个状态,或者 对结果并不影响。dp数组一定会有一维表示 当前枚举到的 位数。
模版:
///如 此处设立的dp数组为二维
int dp[maxn][maxn];
int a[maxn];
int dfs(int pos,int sta,/*可根据需要添加*/,bool limit){ //pos从0开始
if(pos == -1) return ;/*根据需要 return 0; 或 return 1;*/
if(!limit && dp[pos][sta] != -1) return dp[pos][sta];
int up = limit ? a[pos] : 9;
int ans = 0;
for(int i = 0;i <= up;i ++){
/*根据需要做相应的处理*/
ans += dfs(pos-1,sta,/*...*/,limit && i == a[pos]);
}
if(!limit) dp[pos][sta] = ans; //有条件的记忆化
return ans;
}
int slove(int x){
int pos = 0;
while(x){
a[pos ++] = x % 10;
x /= 10;
}
int ans = 0;
//做相应处理, 但一定会用到 dfs
/*如
for(int i = 0;i < (某个值) ;i ++)
ans += dfs(pos-1,sta,(i),(...),true);
*/
/*或者
ans = dfs(pos-1,sta,(...),true);
*/
return ans;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)){
memset(dp,-1,sizeof(dp));
printf("%d\n",slove(m) - slove(n-1));
}
return 0;
}