BZOJ 1026 [SCOI2009]windy数【数位DP】
2016-07-19 08:29
465 查看
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1026题意:
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
分析:
比较基础的数位dp,设dp[i][j][k][m],其中k标记是否与原数相等,m标记是否全为0,因为如果前面全为0的话,那么这一位可以放任何数。表示进行到第i位,数字为j的数一共有多少种,两个数做个差即可。
代码:
/************************************************************************* > File Name: 1026.cpp > Author: jiangyuzhu > Mail: 834138558@qq.com > Created Time: 2016/7/18 20:52:36 ************************************************************************/ #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> #include<set> #include<map> #include<algorithm> using namespace std; const int maxn = 10 + 5; int dp[maxn][maxn][2][2]; char s[maxn]; int a[maxn]; int len; int solve(char *s) { len = strlen(s); for(int i = 0; i < len; i++){ a[i] = s[i] - '0'; } for(int i = 1; i < a[0]; i++){ dp[0][i][1][1] = 1; } dp[0][a[0]][0][1] = 1; dp[0][0][1][0] = 1;// 全为0 for(int i = 1; i < len; i++){ if(abs(a[i] - a[i - 1]) >= 2) dp[i][a[i]][0][1] = dp[i - 1][a[i - 1]][0][1]; for(int j = 0; j < 10; j++){ for(int k = 0; k < 10; k++){ if(k == 0){ if(j == 0) dp[i][j][1][0] += dp[i - 1][k][1][0]; else dp[i][j][1][1] += dp[i - 1][k][1][0]; } if(abs(j - k) >= 2) dp[i][j][1][1] += dp[i - 1][k][1][1]; } if(j < a[i] && abs(j - a[i - 1]) >= 2) dp[i][j][1][1] += dp[i - 1][a[i - 1]][0][1]; } } int ans = 0; for(int i = 0; i < 10; i++){ ans += dp[len - 1][i][1][1]; } return ans; } int main (void) { scanf("%s", s); int ans = solve(s); memset(dp, 0, sizeof(dp)); memset(a, 0, sizeof(a)); scanf("%s", s); int ans1 = dp[len - 1][a[len - 1]][0][1] + solve(s); printf("%d\n", ans1 - ans); return 0; }
相关文章推荐
- 项目总结(2p)
- 1sting
- python学习——使用SQLite
- JAVA中HashMap和Hashtable区别(转)
- [Cloud Computing]Mechanisms: Load Balancer
- 大菲波数
- Acm 素数距离问题
- Android开发自定义View实现数字与图片无缝切换的2048
- [JQ权威指南]$.ajaxSetup()方法全局设置Ajax
- toj 3515堆的应用
- python学习——数据库
- 处理url中的中文字符
- java 垃圾回收机制(转)
- Linux--Date命令详解
- 面试题汇总
- 云直播系统架构与实施
- 面试题40:数组中只出现一次的数字
- c3p0数据库连接池
- CentOS 下 MySQL 5.7 编译安装
- paper 82:边缘检测的各种微分算子比较(Sobel,Robert,Prewitt,Laplacian,Canny)