数位dp n内1的个数递推找规律
2014-10-13 22:27
239 查看
1061:数字统计
查看提交
统计
提问
总时间限制: 1000ms 内存限制: 10000kB
描述给出一个整数n(1<=n<=20000000),要求输出从1到n间所有数字中“1”的出现次数.例如:数字11,1到11间数字“1”的出现次数为4。(1,10,11,11出现4次,因为11有两个1,所以出现4次)
输入一个整数n,(1<=n<=20000000)
输出输出一行,输出“1”的出现次数。
样例输入
11
样例输出
4
http://wyu.openjudge.cn/practice/1061
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<vector> #include<queue> #include<map> #include<stack> #define rt return #define bk break #define ct continue #define sf scanf #define pf printf #define ms memset #define si(n) sf("%d",&n) #define pi(n) pf("%d\n",n) #define REP0(i,n) for(int i=0;i<(n);i++) #define REP1(i,n) for(int i=1;i<=(n);i++) #define REP(i,s,n) for(int i=s;i<=(n);i++) #define db double #define op operator #define pb push_back #define LL long long #define INF 0x3fffffff #define eps 1e-8 #define PI acos(-1) #define maxn 1010 using namespace std; int f[100]; void init(){ f[0]=0; for(int i=1;i<=9;i++)f[i]=1; f[10]=2; f[11]=4; for(int i=12;i<=19;i++)f[i]=f[i-1]+1; for(int i=20;i<=99;i++){ if(i%10==1)f[i]=f[i-1]+1; else f[i]=f[i-1]; } } int dp(int n){ if(n<=99)rt f ; int tmp=1; while(tmp<=n)tmp*=10; tmp/=10; int res; if(n/tmp==1){ res=dp(tmp-1)+dp(n%tmp)+10*(n/10-tmp/10)+(n%10)+1; }else { res=(n/tmp)*dp(tmp-1)+dp(n%tmp)+tmp; } rt res; } int main(){ #ifdef ACBang freopen("in.txt","r",stdin); freopen("dp.txt","w",stdout); #endif init(); int n; while(~sf("%d",&n)){ int ans; if(n<=99)ans=f ; else ans=dp(n); // pf("%d %d\n",n,ans); pf("%d\n",ans); } rt 0; }//修剪版!!!!!!!!!
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<vector> #include<queue> #include<map> #include<stack> #define rt return #define bk break #define ct continue #define sf scanf #define pf printf #define ms memset #define si(n) sf("%d",&n) #define pi(n) pf("%d\n",n) #define REP0(i,n) for(int i=0;i<(n);i++) #define REP1(i,n) for(int i=1;i<=(n);i++) #define REP(i,s,n) for(int i=s;i<=(n);i++) #define db double #define op operator #define pb push_back #define LL long long #define INF 0x3fffffff #define eps 1e-8 #define PI acos(-1) #define maxn 1010 using namespace std; int dp(int n){ if(n==0)rt 0; if(n<=9)rt 1; int tmp=1; while(tmp<=n)tmp*=10; tmp/=10; int res; if(n/tmp==1){ res=dp(tmp-1)+dp(n%tmp)+10*(n/10-tmp/10)+(n%10)+1; }else { res=(n/tmp)*dp(tmp-1)+dp(n%tmp)+tmp; } rt res; } int main(){ #ifdef ACBang freopen("in.txt","r",stdin); freopen("dp.txt","w",stdout); #endif int n; while(~sf("%d",&n)){ int ans; ans=dp(n); pf("%d\n",ans); } rt 0; }
相关文章推荐
- 2017年icpc西安网络赛 Maximum Flow (找规律+数位dp)
- HDU 4588 Count The Carries 数位DP || 打表找规律
- HDU 2089 不要62 (递推+暴力或者数位DP)
- bzoj 2728 与非 【找规律】 【位运算】 【数位dp】
- HDU 4588 Count The Carries 数位DP || 打表找规律
- hihoCode 1249 A Math Problem ACM/ICPC 2015 Beijing (数位dp+规律)
- hdu3555(数位DP dfs/递推)
- HDU 4734--基础数位dp(递推)
- codeforces215E(数位DP,规律水过)
- HDU 2154 跳舞毯 | DP | 递推 | 规律
- HDU 4722 Good Numbers 数位dp或找规律枚举 数位dp感悟
- BC #75 hdu 5642 数位dp/ 递推
- poj 2440 DNA (dp|递推|找规律|矩阵乘法)
- C. Tennis Championship dp递推 || 找规律
- 递推dp数位
- 不要62(递推+数位DP解析)
- hdu2089(数位DP 递推形式)
- hdu 4722 Good Numbers(找规律,记忆化搜索,数位dp)
- [找规律 递归子问题 || 数位DP] BZOJ 4513 [Sdoi2016]储能表
- 在谈数位dp_用记忆优化解决无法递推的题目