关闭

数位DP 刷水

标签: bzojdp
181人阅读 评论(0) 收藏 举报
分类:

Bomb(HDU 3555)

#include <cstdio>
#define FOR(i,j,k) for(i=j;i<=k;i++)
typedef unsigned long long ull;
ull dp[32][10];
void init() {
    int i, j, k;
    dp[0][0]=1;
    FOR(i,1,25) FOR(j,0,9) {
    	dp[i][j]=0;
    	FOR(k,0,9) if(!(j==4&&k==9))
    		dp[i][j]+=dp[i-1][k];
    }
}
ull calc(ull n) {
    static ull digit[32];
    ull l = 0, ans = 0;
    while(n) {
        digit[++l]=n%10;
        n/=10;
    }
    digit[l+1]=0;
    for(ull i=l;i;i--) {
        for(ull j=0;j<digit[i];j++)
            if(!(digit[i+1]==4&&j==9))
                ans+=dp[i][j];
                if(digit[i]==9&&digit[i+1]==4) break;
            }
        return ans;
}
int main() {
    ull i; int t;
    init();
    scanf("%d", &t);
    while(t--) {
    	scanf("%llu", &i);
    	printf("%llu\n", i+1-calc(i+1));
    }
    return 0;
}

不要62(HDU 2089)

#include <cstdio>
#define FOR(i,j,k) for(i=j;i<=k;i++)
int dp[16][10];
void init() {
    int i, j, k;
    dp[0][0]=1;
    FOR(i,1,14) FOR(j,0,9) {
        dp[i][j]=0;
        if(j!=4) FOR(k,0,9) if(!(j==6&&k==2))
            dp[i][j]+=dp[i-1][k];
    }
}

int calc(int n) {
    static int digit[16];
    int l = 0, ans = 0;
    while(n) {
        digit[++l]=n%10;
        n/=10;
    }
    digit[l+1]=0;
    for(int i=l;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]==2&&digit[i+1]==6))
            break;
    }
    return ans;
}

int main() {
    int i, j;
    init();
    while(~scanf("%d%d", &i, &j)) {
        if(i+j==0)break;
        printf("%d\n", calc(j+1)-calc(i));
    }
    return 0;
}


Windy数(SCOI 2009, BZOJ 1026)

#include <cstdio>
#include <cstdlib>
#define FOR(i,j,k) for(i=j;i<=k;i++)
int dp[11][10];
void init() {
    int i, j, k;
    FOR(i,0,9) dp[1][i]=1;
    FOR(i,2,10) FOR(j,0,9) {
        dp[i][j]=0;
        FOR(k,0,9) if(abs(j-k)>1)
            dp[i][j]+=dp[i-1][k];
    }
}
 
int calc(int n) {
    static int digit[11];
    int l = 0, ans = 0, i, j;
    while(n) {
        digit[++l]=n%10;
        n/=10;
    }
    digit[l+1]=0;
    FOR(i,1,l-1) FOR(j,1,9) ans+=dp[i][j];
    for(j=1;j<digit[l];j++) ans+=dp[l][j];
    for(i=l-1;i;i--) {
        for(j=0;j<digit[i];j++)
            if(abs(digit[i+1]-j)>1)
                ans+=dp[i][j];
        if(abs(digit[i]-digit[i+1])<2)
            break;
    }
    return ans;
}
 
int main() {
    int i,j;
    init();
    while(~scanf("%d%d", &i, &j)) {
        printf("%d\n", calc(j+1)-calc(i));
    }
    return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

数位dp入门详解

基础篇 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数。所谓数位dp,字面意思就是在数位上进行dp咯。数位还算是比较好听的名字,数位的含义:一个数有个位、十位...
  • CillyB
  • CillyB
  • 2017-02-19 23:07
  • 1776

【数位dp】(涉及到处理前导0问题)

数位dp记忆化搜索中,深搜计算dp值必先经过0-0-0 这条递归途径, 如果前导0对答案不影响那么无所谓,但是影响答案那么需要记录处理。 问题来源比较奇特,我理解错了SPOJ - BALNUM的题意...
  • qq_33199236
  • qq_33199236
  • 2017-05-24 19:52
  • 304

数位dp总结 之 从入门到模板

for(int i=le;i<=ri;i++) if(right(i)) ans++; 基础篇 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数。...
  • wust_zzwh
  • wust_zzwh
  • 2016-08-03 14:37
  • 16354

【数位DP】BZOJ3780数字统计

Time Limit: 10 Sec Memory Limit: 128 MB Description 小A正在研究一些数字统计问题。有一天他突然看到了一个这样的问题: 将[L..R][L.....
  • cqbztsy
  • cqbztsy
  • 2016-02-26 12:20
  • 662

数位DP学习小结

一、学习心得体会 问题描述: 一般体现为,定义某种性质K,问某区间内具有K性质的数的个数 往往给的区间会很大,对区间内的每个数进行判断显然会超时 于是数位DP登场 数位DP,顾名思义,是对数字的每一位...
  • tomorrowtodie
  • tomorrowtodie
  • 2016-08-06 21:03
  • 1375

HDU2089 不要62(数位DP入门经典题目)

昨天做了一道很奇怪的数字题,不知道怎么做,今天才知道是数位DP ……我来学习学习。 传送门 大意:给定区间[n,m][n,m],求在n到m中没有“62“或“4“的数的个数。如62315包含62,8...
  • geng4512
  • geng4512
  • 2015-08-24 20:48
  • 1180

[jzoj]3735. 【Usaco2014Open银组】里程计(odometer) (经典数位DP+详细分析)

https://jzoj.net/senior/#main/show/3735Problem:求[x..y][x..y]中的有趣数.有趣数的定义如下:若一个数字至少有一半以上的数位上拥有相同的数字,则...
  • Algor_pro_king_John
  • Algor_pro_king_John
  • 2017-07-30 21:25
  • 263

【数位DP——题集及提示】

4207 -- 【模拟试题】不要62    最简单数位DP 不解释 4600 -- 【模拟试题】迷信的黄学长   挺坑!注意有正反向两种连续,传递序列里是否有2,4这两个参数,另外还要传...
  • qq_30303087
  • qq_30303087
  • 2016-04-28 22:26
  • 458

poj3252 数位dp(所有比n小的二进制位0的个数不少于1的个数)记忆化搜索

http://poj.org/problem?id=3252 Description The cows, as you know, have no fingers or thumbs an...
  • u013573047
  • u013573047
  • 2015-02-21 08:46
  • 882

2017广东工业大学程序设计竞赛决赛 Problem G: 等凹数字(回文+数位dp)

Problem G: 等凹数字 Description 定义一种数字称为等凹数字,即从高位到地位,每一位的数字先非递增再非递减,不能全部数字一样,且该数是一个回文数,即从左读到右与从右读到左是一样...
  • HHH_go_
  • HHH_go_
  • 2017-03-29 18:27
  • 1063
    个人资料
    • 访问:165526次
    • 积分:6016
    • 等级:
    • 排名:第4886名
    • 原创:449篇
    • 转载:7篇
    • 译文:0篇
    • 评论:7条
    神犇们的后庭院
    wzq_QwQ http://blog.csdn.net/wzq_QwQ
    vmurder http://blog.csdn.net/vmurder/
    PoPoQQQ http://blog.csdn.net/popoqqq/
    YJQ神犇 http://tarawa.github.io/
    ?神?论文
    http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf