您的位置:首页 > 其它

hdu2089数位dp

2016-02-24 16:00 99 查看
题目很好懂。

思路学习别人的,第一次写数位dp。点击打开链接

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>

using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000")
#define maxn 10
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define INF 100000000
int n , m;
int dp[10][10];

void init()
{
mem(dp , 0);
dp[0][0] = 1;
for(int i = 1 ; i <= 7 ; i ++)
{
for(int j = 0 ; j < 10 ; j ++)
{
for(int k = 0 ; k < 10 ; k ++)
{
if(j != 4 && !(j == 6 && k == 2))
dp[i][j] += dp[i-1][k];
}
}
}
}

int solve(int n)
{
init();
int digit[10];
int pos = 0;
while(n)
{
digit[++pos] = n % 10;
n /= 10;
}
digit[pos+1] = 0;
int ans = 0;
for(int i = pos ; i ; i--)
{
for(int j = 0 ; j < digit[i] ; j ++)
{
if(j != 4 && !(digit[i+1] == 6 && j == 2))
ans += dp[i][j];
}
if(digit[i] == 4 || (digit[i+1] == 6 && digit[i] == 2))
break;
}
return ans;
}

int main()
{
while(scanf("%d %d" , &n , &m) != EOF && (n || m))
{
printf("%d\n" , solve(m+1) - solve(n));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: