[BZOJ1833]ZJOI2010 数字计数|数位DP
2015-04-18 10:57
232 查看
数位DP太坑爹了(我太弱了),细节好多好多,特别要注意0的地方。。先预处理f[i][j][k]表示第i位为j的串数字k出现的次数,然后YY一下后面的cal。。做数位DP的时候千万要冷静,考虑全面。。
#include<cstdio> #include<iostream> #define ll long long using namespace std; ll a,b,f[15][15][15],sa[15],sb[15],m[15]; int i,j,k,t,w[15]; void cal(ll a,ll *sa) { int i,j,k,len=0; ll t=a; for (i=0;i<=9;i++) sa[i]=0; while (a) w[++len]=a%10,a/=10; for (i=1;i<=len-1;i++) for (j=1;j<=9;j++) for (k=0;k<=9;k++) sa[k]+=f[i][j][k]; for (i=len;i;i--) { for (j=(i==len?1:0);j<w[i];j++) { for (k=0;k<=9;k++) sa[k]+=f[i][j][k]; } sa[w[i]]+=t%m[i-1]+1; } } int main() { scanf("%lld%lld",&a,&b); m[0]=1; for (i=1;i<=14;i++) m[i]=m[i-1]*10; for (i=0;i<=9;i++) for (j=0;j<=9;j++) f[0][i][j]=0; for (i=1;i<=13;i++) { for (j=0;j<=9;j++) for (k=0;k<=9;k++) { f[i][j][k]=(j==k)*m[i-1]; for (t=0;t<=9;t++) f[i][j][k]+=f[i-1][t][k]; } } cal(a-1,sa);cal(b,sb); printf("%lld",sb[0]-sa[0]); for (i=1;i<=9;i++) printf(" %lld",sb[i]-sa[i]); }
相关文章推荐
- BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)
- bzoj 1833: [ZJOI2010]count 数字计数(数位dp)
- [BZOJ 1833][ZJOI 2010]count数字计数(数位DP)
- BZOJ 1833 [ZJOI2010]count 数字计数(数位dp)
- 洛谷P2602|bzoj1833 [ZJOI2010]数字计数 数位dp
- 【BZOJ 1833】【ZJOI 2010】[数位DP]count 数字计数
- [省选前题目整理][BZOJ 1833][ZJOI 2010]count 数字计数(数位DP)
- 【BZOJ1833】【ZJOI2010】数字计数 数位DP
- BZOJ_1833_[ZJOI2010]count 数字计数_数位DP
- [BZOJ1833][ZJOI2010]count 数字计数(数位dp)
- [bzoj 1833] [ZJOI2010]count 数字计数:数位DP
- [BZOJ 1833] [ZJOI2010] count 数字计数 【数位DP】
- 【bzoj1833】[ZJOI2010]count 数字计数 数位DP
- BZOJ 1833: [ZJOI2010]count 数字计数 [数位DP]
- BZOJ1833 [ZJOI2010]count 数字计数 【数学 Or 数位dp】
- 【BZOJ 1833】 [ZJOI2010]count 数字计数|数位DP
- 【BZOJ】1833: [ZJOI2010]count 数字计数(数位dp)
- BZOJ 1833 ZJOI 2010 count 数字计数 数位DP
- BZOJ-1833 [ZJOI2010]count 数字计数 数位DP
- [BZOJ1833] [ZJOI2010]count 数字计数 && 数位DP