数位 DP.
code:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 703
#define ll long long
#define mod 1000000007
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
char str[N];
int n,a[N],f[N][N][10][2];
int main() {
// setIO("input");
scanf("%s",str+1),n=strlen(str+1);
for(int i=1;i<=n;++i) a[i]=str[i]-'0';
for(int i=1;i<=9;++i) f[0][0][i][0]=1;
for(int i=0;i<n;++i) {
for(int k=1;k<=9;++k) {
for(int j=0;j<=i;++j) {
for(int l=0;l<2;++l) {
int lim=l?9:a[i+1];
for(int p=0;p<=lim;++p) {
(f[i+1][j+(p>=k)][k][l|(p<a[i+1])]+=f[i][j][k][l])%=mod;
}
}
}
}
}
int ans=0;
for(int k=1;k<=9;++k) {
int re=1;
for(int i=1;i<=n;++i) {
(ans+=(ll)re*(f[n][i][k][0]+f[n][i][k][1])%mod)%=mod;
re=(ll)((ll)re*10%mod+1)%mod;
}
}
printf("%d\n",ans);
return 0;
}
本文深入探讨了数位DP算法的原理与应用,通过详细解释代码实现过程,帮助读者理解如何利用数位DP解决复杂问题。文章展示了从初始化状态到递推公式的设计思路,并通过具体实例讲解了算法的运行流程。
9288

被折叠的 条评论
为什么被折叠?



