您的位置:首页 > 其它

HDU-3555 Bomb 数位DP

2014-04-15 17:27 369 查看
题目链接

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 25;
typedef unsigned __int64  Int64;

Int64 N, dp[maxn][3];
int digit[maxn];
/*
dp[len][0] 表示前len位没有49的数字的个数
dp[len][1] 表示前len位没有49但是以9结尾的数的个数
dp[len][2] 表示前len位有49的状态
*/
void init()
{
dp[0][0] = 1;
for (int i = 1; i <= 20; ++i) {
dp[i][0] = 10 * dp[i-1][0] - dp[i-1][1];
dp[i][1] = dp[i-1][0];
dp[i][2] = 10 * dp[i-1][2] + dp[i-1][1];
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
init();
int cas, len, flag;
Int64 ret;
scanf("%d", &cas);
while( cas -- ){
flag = ret = 0;
scanf("%I64u", &N);
++ N;
memset(digit, 0, sizeof (digit));
for( len = 1; N; len ++ ){
digit[len] = N % 10;
N /= 10;
}
for (int i = len-1; i >= 1; --i) {
ret += digit[i] * dp[i-1][2]; // 已经有49就直接加上
if ( flag ) {
ret += digit[i] * dp[i-1][0];
}
else if ( !flag && digit[i] > 4 ) {
ret += dp[i-1][1];
}
if (digit[i+1] == 4 && digit[i] == 9) {
flag = 1;
}
}
printf("%I64u\n", ret);
}
return 0;
}


#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<math.h>
#include<functional>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 20;
typedef __int64 Int64;
Int64 n;
Int64 dp[maxn][3];
int digit[maxn];
Int64 dfs( int pos,int st,bool flag )
{
if( !pos ) return st == 2;
if( flag && dp[pos][st] != -1 )	return dp[pos][st];
Int64 ans = 0;
int u = flag?9:digit[pos];
for( int i = 0; i <= u; i ++ )
{
if( st == 2 || ( st == 1 && i == 9 ) )	ans += dfs( pos-1,2,flag||i<u );
else if( i == 4 ) ans += dfs( pos-1,1,flag||i<u );
else ans += dfs( pos-1,0,flag||i<u );
}
if( flag )	dp[pos][st] = ans;
return ans;
}
Int64 fun( Int64 x )
{
int len = 0;
while( x ){
digit[++len] = x%10;
x /= 10;
}
return dfs( len,0,0 );
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
int cas;
scanf("%d",&cas);
memset( dp,-1,sizeof(dp) );
while( cas -- )
{
scanf("%I64d",&n);
printf("%I64u\n",fun(n));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: