类型:数位DP
题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。问[A,B]之间windy数的个数。(1 <= A <= B <= 2000000000 )

思路:

设状态dp[i][d][preAllZero] 表示 d开头的i位数中,当其preAllZero(true 表示前面都是0)的时候,windy数的个数。

为什么有preAllZero这一个状态呢?因为,比如002这个数,如果前面都是0,则是可以的,但如果前面有一位不是0 ,则这两个0违反了windy数的规则,就不行。

转移就不写了。见程序就好。

坑:

没有设preAllZero这个状态,结果一直WA。最近发现老是考虑不完全,结合近两次的原因分析,均为有了思路写程序,写完或者写到一半发现某个地方想错了,然后打补丁,结果没打全,就出了漏洞。总结两点:1:先有清晰的思路,再上阵写程序,只会节省时间。(在纸上思考要时间,你以为敲代码的时候这部分时间就省了?反而是在纸上想完全,然后敲代码的时候就可以不用想了,快啊~~)2:万一敲完发现BUG,打完补丁还不对,最好推倒,重新整理思路,然后再去写(但也不是说要把程序删了重写,或许并没到这个地步,只是没想全而已~)

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int num[];
long long dp[][][]; long long dfs(int i, int d, bool preAllZero, bool isQuery) {
if (!isQuery && ~dp[i][d][preAllZero]) return dp[i][d][preAllZero];
if (i == ) {
return dp[i][d][preAllZero] = ;
}
int end = isQuery?num[i-]:;
long long ans = ;
for (int j = ; j <= end; j++) {
if (!preAllZero && abs(j-d)<=) continue;
ans += dfs(i-, j, preAllZero && j == , isQuery && j==end);
}
if (!isQuery) dp[i][d][preAllZero] = ans;
return ans;
} long long cal(int x) {
int len = ;
while (x) {
num[++len] = x%;
x/=;
}
return dfs(len+, , true, true);
} int main() {
int a, b;
memset(dp, -, sizeof(dp));
while (~scanf("%d%d", &a, &b)) {
printf("%lld\n", cal(b) - cal(a-));
}
return ;
}

最新文章

  1. Django调用JS、CSS、图片等静态文件
  2. [转]windows下和Ubuntu下adb找不到设备的解决方法
  3. svg学习(九)path
  4. HDOJ 4749 Parade Show
  5. 存储过程获取最后插入到数据表里面的ID
  6. 设置ASP.NET页面的运行超时时间详细到单个页面及站点
  7. onclick事件与onserverclick事件
  8. JS中的间歇(周期)调用setInterval()与超时(延迟)调用setTimeout()相关总结
  9. vs 2013 编译zlib
  10. android 发送短信 怎样做到一条一条的发送,仅仅有在上一条发送成功之后才发送下一条短信
  11. EJB通过ANT提高EJB应用程序的开发效率、无状态发展本地接口bean、开发状态bean
  12. java文件处理之压缩,分割
  13. hdu1213 How Many Tables 并查集的简单应用
  14. Nginx实现负载均衡&amp;Nginx缓存功能
  15. 网友&quot;就像一支烟&quot;山寨币分析估值方法
  16. jQuery中的自定义插件之----工厂方法(Factory Widget)
  17. 用web技术写APP
  18. 简述我理解的C#
  19. CentOS安装Nginx Pre-Built
  20. MySQL Workbench常用快捷键

热门文章

  1. 【动态规划】bzoj1705: [Usaco2007 Nov]Telephone Wire 架设电话线
  2. [BZOJ] 1127: [POI2008]KUP
  3. Spring Boot 应用 快速发布到linux服务器的脚本代码示例
  4. shell 练习题 - 第三周
  5. 01windows常用命令及批处理
  6. [提供可行性脚本] RHEL 7/CentOS 7/Fedora28 重命名网卡名称
  7. spring boot yaml 自定义配置 映射到 java POJO
  8. golang 函数的特殊用法
  9. 下载旧版本的JDK
  10. BZOJ 5064: B-number