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; }
相关文章推荐
- HDU 3555 Bomb(数位DP)
- HDU 3555 Bomb 简单数位DP
- HDU 3555 Bomb(数位dp&记忆化搜索)
- hdu 3555 Bomb 数位DP
- hdu 3555 Bomb 【数位DP】
- [数位DP]Hdu 3555——Bomb
- HDU-3555-数位DP-Bomb
- HDU 3555 Bomb(数位DP)
- HDU 3555 Bomb(数位DP)
- HDU 3555 Bomb 数位dp
- HDU 3555 Bomb 数位DP 入门
- HDU 3555 Bomb(基础数位dp)
- 【HDU 3555】Bomb 数位dp模板
- HDU 3555 Bomb (数位DP)
- HDU 3555 Bomb 基础数位dp
- HDU 3555 Bomb (数位DP)
- HDU-3555 Bomb 数位DP
- HDU-3555-Bomb(数位DP)
- Bomb(HDU 3555 数位DP)
- hdu 3555 Bomb(数位dp)