定义windy数:相邻数字的差至少是2的数,例如10不是windy数,而13是windy数。求给定区间中有多少windy数。区间端点范围为 [1, 2000000000]

dfs写法

#include <stdio.h>
#include <string.h>
#define N 10
int dp[N][N],digit[N];
int dfs(int pos,int last,int z,int f)
{if(pos==-1) return 1;if(z&&!f&&dp[pos][last]!=-1)    return dp[pos][last];int max=f?digit[pos]:9;int ret=0;if(z==0){for(int i=0;i<=max;i++){ret+=dfs(pos-1,i,i,f&&i==max);}}else{for(int i=0;i<=max;i++){if((i-last)*(i-last)<4) continue;ret+=dfs(pos-1,i,1,f&&i==max);}}if(z&&!f)   dp[pos][last]=ret;return ret;
}
int cal(int x)
{int pos=0;while(x){digit[pos++]=x%10;x/=10;}return dfs(pos-1,0,0,1);
}
int main()
{memset(dp,-1,sizeof(dp));int a,b;while(~scanf("%d%d",&a,&b)) printf("%d\n",cal(b)-cal(a-1));return 0;
}

递推写法

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define LEN 15
char a[LEN],b[LEN];
int n,m;
int dp[LEN][10][2][2][2];       //第二维记录最后的数字,第三维记录状态是否合法,第四维记录该位是否是最高位,最后一维记录是否达到上界
int nextstate(int cur,int last,int in)
{if(cur==0 && abs(last-in)>=2)   return 0;return 1;
}
int nextflag1(int cur,int in,int max)
{if(cur==1 && in==max)   return 1;if(cur==1 && in>max)    return -1;return 0;
}
int nextflag2(int cur,int in)
{if(cur==1 && in==0) return 1;return 0;
}
int DP(char *s,int len)
{memset(dp,0,sizeof(dp));dp[0][0][0][1][1]=1;for(int i=1;i<=len;i++)for(int last=9;last>=0;last--)for(int state=0;state<2;state++)for(int flag1=0;flag1<2;flag1++)for(int flag2=0;flag2<2;flag2++)for(int in=0;in<10;in++){int nxt=nextstate(state,last,in);if(flag2==1)    nxt=0;if(nextflag1(flag1,in,s[i]-'0')!=-1)dp[i][in][nxt][nextflag1(flag1,in,s[i]-'0')][nextflag2(flag2,in)]+=dp[i-1][last][state][flag1][flag2];}int ret=0;for(int i=0;i<10;i++)   ret+=dp[len][i][0][0][0]+dp[len][i][0][1][0];return ret;
}
int main()
{while(~scanf("%d%d",&n,&m)){n--;sprintf(a+1,"%d",n);sprintf(b+1,"%d",m);printf("%d\n",DP(b,strlen(b+1))-DP(a,strlen(a+1)));}return 0;
}

转载于:https://www.cnblogs.com/algorithms/archive/2012/08/02/2620431.html

1026: [SCOI2009]windy数 (按位DP)相关推荐

  1. bzoj 1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 7688  Solved: 3470 [Submit][S ...

  2. bzoj:1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 7982  Solved: 3593 Descriptio ...

  3. BZOJ 1026 [SCOI2009]windy数

    1026: [SCOI2009]windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间 ...

  4. bzoj 1026 //1026: [SCOI2009]windy数

    bzoj 1026 //1026: [SCOI2009]windy数   //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1026 / ...

  5. P2657 [SCOI2009] windy 数(数位DP)

    题目链接:[SCOI2009] windy 数 - 洛谷 这是一道需要考虑前导0的数位DP题,为什么需要考虑前导0呢?其实原因很简单,因为有条件限制我们相邻两个数的差,所以我们在进行数位DP时必须把前 ...

  6. bzoj 1026: [SCOI2009]windy数 数位DP算法笔记

    数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...

  7. bzoj 1026: [SCOI2009]windy数

    Time Limit: 1 Sec Memory Limit: 162 MB Submit: 9998 Solved: 4629 [Submit][Status][Discuss] Descripti ...

  8. BZOJ1026 || 洛谷P2657 [SCOI2009]windy数【数位DP】

    Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. ...

  9. 洛谷 P2657 [SCOI2009] windy数 数位DP

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 P2657 [SCOI2009 ...

最新文章

  1. Ubuntu 12.04下玩转终端管理器Byobu
  2. 什么是ATL? (与COM的关系,及MFC与COM的关系)
  3. studio项目上传svn服务器,SVN在AndroidStudio中的使用(一),SVN安装配置和项目检出更新...
  4. 在Linux上安装Memcached服务(自己测试过了)
  5. 分享实录 | 单人开发场景下的测试环境实践
  6. mysql不用left join_MySQL在右表数据不唯一的情况下使用left join的方法_MySQL - join
  7. Java 开发环境部署
  8. 550什么意思_布草知识 | 都是羽绒,为什么价格大不同?
  9. 数据结构与算法python—9.二叉树及python实现
  10. Oculus:自己做内容不是长远之计,资助第三方开发者才是王道
  11. 从“规模叙事”迈向“利润叙事”,中国制造背后的“天狼”动力
  12. python乘法口诀表打印
  13. Inkscape制作logo
  14. 【大猛子与曾经的无趣生活】
  15. samtools从fastq到bam再到bigwig(bw)
  16. 知网caj文件转pdf(无需下载任何软件,傻瓜式操作,必看!!!)
  17. 阿里云推出网盘App,开放申请!非会员下载 10MB/s! 还有更厉害的:60M/s
  18. Web全栈开发基础(小白入门版本)
  19. 解决s3.amazonaws.com打不开、下载速度慢等问题
  20. JAVA大数据的第五十九天——The authenticity of host ‘gree129 (192.168.**.129)‘ can‘t be established.

热门文章

  1. 流水线、超流水线、超标量技术对比
  2. C++ const成员和引用成员
  3. php的异常详解,php5异常处理详解_php
  4. linux下使用VS CODE + CMAKE 调试C++程序
  5. 计算机维修工中级实践考试,计算机维修工(中级)技能考核.doc
  6. php网站404页面302,404页面该怎么做?
  7. c++内存管理-内存顺序
  8. Tomcat中部署后JspFactory报异常的解决方案
  9. 交换机与路由器主要功能的区别和联系
  10. Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)