您的位置:首页 > 其它

喵哈哈的日常选数问题(数位DP)

2015-07-17 21:48 288 查看
E - 喵哈哈的日常选数问题

Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)

Submit Status

Problem Description

喵哈哈村子的TTT同学比较怪,他非常讨厌一类数字,是哪种呢?

就是讨厌那些含有37或者4的数

比如 21379,123485,12379。

但是他并不讨厌928357这个数,因为他即不包含37,也没有4。

现在你[L,R]的区间,问你在这个区间中,最多能够选出多少个TTT同学不讨厌的数呢?

Input

输入两个整数,表示L和R

1 <= L <= R <= 2000000000 。

Output

输出一个整数,表示选出的数的个数

Sample Input

1 10

Sample Output

9

Submit

题目大意:给出一个区间,求不含37或者4的数个数

分析:经典数位DP问题。推荐一个ppt:http://wenku.baidu.com/view/9de41d51168884868662d623.html

代码:

#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[10][10];
void init()
{
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(int i = 1; i <= 10;i ++)
{
for(int j = 0; j <10; j++)
{
for(int k = 0; k < 10; k++)
{
if(j !=4 && !(j == 3 && k == 7))
dp[i][j]  += dp[i-1][k];
}
}
}
}
int solve(int n)
{
init();
int digit[10];
int len = 0;
while(n > 0)
{
digit[++len] = n%10;
n /= 10;
}
digit[len+1]=0;
int ans = 0;
for(int i = len; i; i--)
{
for(int j = 0 ;j < digit[i]; j++)
{
if(j !=4 && !(digit[i+1] == 3&& j == 7))
ans += dp[i][j];
}
if(digit[i] == 4 || (digit[i] == 7 && digit[i+1] == 3))
break;
}
return  ans;
}
int main()
{
int l,r;
while(cin>>l>>r)
{
if(l+r == 0)
break;
else
cout<<solve(r+1)-solve(l)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp