数位dp hdu3555

#include <cstdio>
#include <cstring>
#include <set>
#include <iostream>
#include <map>
#include <math.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1000005;
int t,cnt,num[25];
ll n,dp[25][3];
void init(){
dp[0][0]=1;//31行有用到,必须要对其赋值

for(int i=1;i<=20;i++){
    dp[i][0]=dp[i-1][0]*10-dp[i-1][1];//每位数都要包括零在内才行
    dp[i][1]=dp[i-1][0];
    dp[i][2]=dp[i-1][2]*10+dp[i-1][1];
}
}
ll shuwei(){
if(n<49)
    return 0;
ll ans=0;
int flag=0;

for(int i=cnt;i>0;i--){//每次循环内求得是小于当前位置上的数的情况
    ans+=(ll)num[i]*dp[i-1][2];
    if(flag)
        ans+=(ll)num[i]*dp[i-1][0];
    else{
        if(num[i]>4)
            ans+=dp[i-1][1];
    }
  if(num[i+1]==4&&num[i]==9)
    flag=1;
}
return ans;
}
int main()
{
   // freopen("in.txt","r",stdin);
cin>>t;
init();
while(t--){
    scanf("%I64d",&n);
ll n1=n+1;//因为包括n,所以必须要n+1
    cnt=0;
    while(n1){
        num[++cnt]=n1%10;
        n1/=10;
    }
    num[cnt+1]=0;
    ll ans=shuwei();
    cout<<ans<<endl;

}
  return 0;
}
时间: 2024-11-02 02:22:20

数位dp hdu3555的相关文章

hdu3555 Bomb (记忆化搜索 数位DP)

http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 7316    Accepted Submission(s): 2551 Problem Description The counter-terrorists found a time

hdu3555 数位dp

http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time bomb. The number sequence of the time bomb counts from 1 to N. If the current nu

hdu---(3555)Bomb(数位dp(入门))

Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 7921    Accepted Submission(s): 2778 Problem Description The counter-terrorists found a time bomb in the dust. But this time the terrorists

hdu3555 Bomb(数位dp)

Bomb                                                                                     Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)                                                                             

HDU3555 Bomb 题解 数位DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题目大意:求 \([1,n]\) 范围内有多少数包含"49". 解题思路: 这个问题我们可以分两种解法来考虑:第一种是求不包含"49"的数的数量,用后减一下:另一种就是直接求包含"49"的数的数量. 解法1:求多少数不包含"49" 这种方法我们先通过数位DP求出 \([0,n]\) 区间范围内有多少数不包含"49&

数位dp

1.[hdu3709]Balanced Number 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cstdlib> 6 #include<algorithm> 7 #include<ctime> 8 #include<cmath> 9 #include<queue>

HDU 3555 Bomb ,HDU 2089 深刻学习数位dp (各种方法乱用)

数位dp是与数位有关的区间统计 参考: 点击打开链接 思想是将数字拆分,dp[i][j] 长度为i的数字有多少个满足j条件的,从000~999 统计时,计当前数字为x,则其后面数字的变化的倍数是0~x-1 后面接000~999这样刚好统计不到这个数字n本身. eg: 对于一个数,若其首位已经比询问上界小,则剩余位没有任何限制.此时如果能直接处理这一情况,则问题距离解决又会迈出一大步. 例如,在十进制下,计算[10000,54321]内的数字和,我们可以将其分解为: [10000,19999],[

数位dp小记

转载自:http://blog.csdn.net/guognib/article/details/25472879 参考: http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html kuangbin :http://www.cnblogs.com/kuangbin/category/476047.html http://blog.csdn.net/cmonkey_cfj/article/details/7798809 http:/

51nod 1009 - 数字1的数量 - [数位DP][模板的应用以及解释]

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基准时间限制:1 秒 空间限制:131072 KB 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. Input 输入N(1 <= N <= 10^9) Output 输出包含1的个数 Input示例 12 Output示例