51nod 数字1的数量(数位DP)
2016-10-07 00:46
399 查看
给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。 例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。 Input 输入N(1 <= N <= 10^9) Output 输出包含1的个数 Input示例 12 Output示例 5
用一个2维数组表示从1~以为j开头的有i位数的数字有多少个1. 状态转移方程就是: j=1: dp[i][j]=dp[i-1][9]*2+pow(10,i-1); (1,9]: dp[i][j]=dp[i-1][9]+dp[i][j-1]; 还有需要注意的是: 从高位到地位: 如果高位为有1的话,我们还要加上高位以下所有数的1的数量即n%pow(10,i-1), 例如12345,从1开始我们统计1~10000中1的总数量,接着我们统计10001~12345中1的数量时, 其实是依次统计1~2000,1~300,1~40,1~5中1的数量,所以,如果高位有1的话,我们需要加上对应的数量的个数。
#include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cctype> #include<cmath> #include<ctime> #include<string> #include<stack> #include<deque> #include<queue> #include<list> #include<set> #include<map> #include<cstdio> #include<limits.h> #define fir first #define sec second #define fin freopen("/home/ostreambaba/文档/input.txt", "r", stdin) #define fout freopen("/home/ostreambaba/文档/output.txt", "w", stdout) #define mes(x, m) memset(x, m, sizeof(x)) #define pii pair<int, int> #define Pll pair<ll, ll> #define INF 1e9+7 #define Pi 4.0*atan(1.0) #define MOD 1000000007 #define lowbit(x) (x&(-x)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ls rt<<1 #define rs rt<<1|1 typedef long long ll; typedef unsigned long long ull; const double eps = 1e-12; const int maxn = 1010; using namespace std; inline int read(){ int x(0),f(1); char ch=getchar(); while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int dp[10][10]; int num[10]; void init() { mes(dp,0); for(int i=1;i<=9;++i){ for(int j=1;j<=9;++j){ if(1==j){ dp[i][j]=dp[i-1][9]+pow(10,i-1);//dp[i][j]=dp[i-1][9]*2+pow(10,i-1) } else{ dp[i][j]=dp[i][j-1];//dp[i][j]=dp[i-1][9]+dp[i][j-1] } dp[i][j]+=dp[i-1][9]; } } } int cacl(int t) { int k=0; while(t){ num[++k]=t%10; t/=10; } return k; } int main() { init(); int n; n=read(); int k=cacl(n); int res=0; for(int i=k;i>=1;--i){ if(1==num[i]){ res+=n%((int)pow(10,i-1)); } } for(int i=k;i>=1;--i){ if(0==num[i]){ continue; } else if(1==num[i]){ res+=dp[i-1][9]+1; } else{ res+=dp[i][num[i]-1]; } } cout<<res<<endl; }
相关文章推荐
- 51nod数字0-9的数量(数位dp)
- 51nod 1042 数字0-9的数量 数位dp
- 【51nod 1009】数字1的数量 【数位DP 模板】
- 【51Nod】1042 - 数字0-9的数量(数位dp & 递归)
- 51nod 1009 数字1的数量(数位dp)
- 51nod 1042 数字0-9的数量 数位DP
- 51nod:数字1的数量(线性dp or 数位dp)
- 51nod 1042 数字0-9的数量(数位DP)
- 【数位dp入门】51nod 1009 数字1的数量
- 51Nod 1009 数字1的数量(数位dp)
- 51nod 1042 数字0-9的数量(数位dp)
- 51nod 1009 数字1的数量(数位dp)
- 51nod 1009 数字1的数量 数位dp
- 51nod 1042 数字0-9的数量(数位dp)
- 51nod 1042 数字0-9的数量 数位DP
- 数位dp 总结 51nod数字1的数量 数字0-9的数量
- 51nod 1009 数字1的数量(数位dp)
- 51Nod 1042 数字0-9的数量 (数位DP
- 51Nod 1042 数字0-9的数量 (数位DP
- 51nod 1009 数字1的数量【数位dp】