PAT (Advanced Level) Practice 1049 Counting Ones (30 分)

Posted Keep--Silent

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT (Advanced Level) Practice 1049 Counting Ones (30 分)相关的知识,希望对你有一定的参考价值。

The task is simple: given any positive integer N, you are supposed to count the total number of 1’s in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1’s in 1, 10, 11, and 12.

Input Specification:
Each input file contains one test case which gives the positive N (≤230).

Output Specification:
For each test case, print the number of 1’s in one line.

Sample Input:
12

Sample Output:
5

题目大意,从1到n,求每个数的1的个数之和
解决:数位dp
从首位往后,每次选1或者不选1,选1则个数加一,不选则保留当前个数。

#include <bits/stdc++.h>
using namespace std;
int num[SIZE];
int ans;
int dfs(int pos,bool limit,int cnt) {
	int ans=0;
	if(pos<0) {
		return cnt;
	}
	//if(limit==0)
	int up=limit?num[pos]:9;
	if(up==0)ans+=dfs(pos-1,limit,cnt);
	if(up==1){
		//选0和选1 
		ans+=dfs(pos-1,false,cnt);
		ans+=dfs(pos-1,limit&&1==num[pos],cnt+1);
	}
	if(up>=2){
		ans+=dfs(pos-1,false,cnt+1);//选1 
		ans+=(up-1)*dfs(pos-1,false,cnt);//选0,2,3..up-1 
		ans+=dfs(pos-1,limit,cnt);//选up 
	}
	return ans;
}
int main() {
	int n,m,k=0,i,j,x,pot;
	cin>>n;
	x=n;
	while(x) {
		num[k++]=x%10;
		x/=10;
	}
	cout<<dfs(k-1,true,0)<<endl;
	return 0;
}

pos是第几位,limit是判断是否前面的每一位都是上界,cnt是前面1的个数。
数位dp的关键:
ans+=dfs(pos-1,limit && i==a[pos]) ;

以上是关于PAT (Advanced Level) Practice 1049 Counting Ones (30 分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT Advanced Level 1043

PAT Advanced Level 1079

PAT Advanced Level 1095

PAT Advanced Level 1038

pat advanced level 1063

PAT Advanced level 1003 Emergency