loj10165. 「一本通 5.3 例 3」Windy 数

2021-03-22 06:25

阅读:482

标签:ace   space   长度   max   mes   clu   --   color   ret   

思路:
  数位dp,设f[i][j]为以i为首元素, 长度为j, 的合题方案种数。

#include
#include
#include
#includestring>
#includeusing namespace std;
const int maxn = 40;
long long f[maxn][maxn];
long long ppow10[maxn];
long long getws(long long x){
    for(int i = 18; i >= 0; --i){
        if(x >= ppow10[i])
            return i + 1;
    }
    return 1;
}
long long getxk(long long x, long long k){
    if(k > getws(x))    return 0;
    return (x / ppow10[k - 1]) % 10;
}
void init(){
    ppow10[0] = 1;
    for(long long i=1; i20; ++i)
        ppow10[i] = ppow10[i - 1] * 10;    
    for(int i=0; i10; ++i)
        f[i][1] = 1;        
    for(long long j=2; j11; ++j)
        for(long long i=0; i10; ++i)
            for(long long k = 0; k10; ++k)
                if(k 2 || k >= i + 2)
                    f[i][j] += f[k][j-1];
}
long long DP(long long x, long long ws){
    long long ans = 0;
    for(long long i = 1; i i)
        for(long long j = 1; j 10; ++j)
            ans += f[j][i];    
    for(long long i = 1; i i)
        ans += f[i][ws];            
    for(long long i = ws - 1; i >= 1; --i){
        for(long long j = 0; j j)
            if(j 1) - 2 || j >= getxk(x, i + 1) + 2)
                ans += f[j][i];
        if(getxk(x, i) > getxk(x, i + 1) - 2 && getxk(x, i) 1) + 2)
            return ans;        
    }
    return ans;        
}
int main(void)
{
    init();
    long long a, b;
    cin >> a >> b;
    cout 1, getws(b + 1)) - DP(a, getws(a))  endl;
}

 

loj10165. 「一本通 5.3 例 3」Windy 数

标签:ace   space   长度   max   mes   clu   --   color   ret   

原文地址:https://www.cnblogs.com/junk-yao-blog/p/9495374.html


评论


亲,登录后才可以留言!