leetcode2719. 统计整数数目

const int mod=1000000007,N=25,M=410;
class Solution {
public:
    int f[N][M][2];
    bool check(string num,int min_sum,int max_sum){
        int sum=0;
        for(int i=0;i<num.size();i++){
            sum+=num[i]-'0';
        }
        if(sum>=min_sum&&sum<=max_sum) return true;
        else return false;
    }
    int dp(string num,int min_sum,int max_sum,int i,int sum,int free){
        if(sum>max_sum) return 0;
        if(sum+(num.size()-i)*9<min_sum) return 0;
        if(i==num.size()) return 1;
        if(f[i][sum][free]!=-1) return f[i][sum][free];
        int ans=0;
        int cur=num[i]-'0';
        if(free==0){
            for(int pick=0;pick<cur;pick++) ans=(ans+dp(num,min_sum,max_sum,i+1,sum+pick,1))%mod;
            ans=(ans+dp(num,min_sum,max_sum,i+1,sum+cur,0))%mod;
        }else{
            for(int pick=0;pick<=9;pick++) ans=(ans+dp(num,min_sum,max_sum,i+1,sum+pick,1))%mod;
        }
        f[i][sum][free]=ans;
        return ans;
    }
    int count(string num1, string num2, int min_sum, int max_sum) {
        int ans=0;
        memset(f,-1,sizeof f);
        ans=(ans+dp(num2,min_sum,max_sum,0,0,0))%mod;
        memset(f,-1,sizeof f);
        ans=(ans-dp(num1,min_sum,max_sum,0,0,0)+mod)%mod;
        if(check(num1,min_sum,max_sum)) ans=(ans+1)%mod;
        return ans;
    }
};
posted @ 2025-03-16 09:09  九三青梧  阅读(9)  评论(0)    收藏  举报