【数位DP】 HDU 3555 Bomb
2014-12-08 22:49
351 查看
点击打开链接
求0-N之内 存在49的个数
先是统计了0-2^63内所有没有49的个数
n-getans(n+1)+1;
getans(n+1)统计的是 0-n内的个数
求0-N之内 存在49的个数
先是统计了0-2^63内所有没有49的个数
n-getans(n+1)+1;
getans(n+1)统计的是 0-n内的个数
#include <cstdio> #include <cstring> #include <cstdlib> #include <string> #include <iostream> #include <algorithm> #include <sstream> #include <cmath> using namespace std; #include <queue> #include <stack> #include <set> #include <vector> #include <deque> #include <map> #define cler(arr, val) memset(arr, val, sizeof(arr)) #pragma comment(linker, "/STACK:102400000,102400000") typedef long long LL; const int MAXN = 102020; const int MAXM = 240000; const int INF = 0x3f3f3f3f; const int mod = 1000000007; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 LL dp[20][10]; void init() { cler(dp,0); dp[0][0]=(LL)1; for(int i=1;i<=18;i++) for(int j=0;j<=9;j++)// j表示当前位,k表示j之前一位 for(int k=0;k<=9;k++) { if((j==4&&k==9)) continue;//出现49 dp[i][j]+=dp[i-1][k]; } } LL getans(LL n) { LL ans=0; int digit[20],len=0; cler(digit,0); while(n) { digit[++len]=n%10; n/=10; } for(int i=len;i>=1;i--) { for(int j=0;j<digit[i];j++)//统计0 - digit[i]-1 上的个数,下一个i表示digit[i+1]上所有的数 { if(j==9&&digit[i+1]==4) continue; ans+=dp[i][j]; } if(digit[i]==9&&digit[i+1]==4)//出现了49接下来的数都不是了 break; } return ans; } int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif LL n,t; cin>>t; init(); while(t--) { cin>>n; printf("%I64d\n",n-getans(n+1)+1); } return 0; }
相关文章推荐
- HDU 3555 Bomb (数位DP)
- hdu 3555 - Bomb [数位dp]
- hdu 3555 Bomb(数位DP)
- hdu 3555 Bomb(数位DP,4级)
- 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详解】
- 【数位DP】【HDU 3555】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)