HYSBZ 1026——windy数(数位dp)
来源:互联网 发布:淘宝如何看店铺所在地 编辑:程序博客网 时间:2024/06/06 15:53
重新搞了一下数位dp。。学会了用类似于dfs的递归方式去写。
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
我们假设当dep<0的时候就算是找到了一个符合要求的数。
less则代表之前枚举的数位上是否有过数字比给定的上界数字对应数位上的数字小。
1)less为真,则表示当前数位可以枚举的值为0~9
2)less为假,只能枚举0~x对应位的数字
dp[dep][pre]:记录的是枚举到dep位,前一位是pre,且less为真的情况下,枚举所有后缀能够得到的满足条件的方案数。
其余的注释已经在代码中了。
#include<cstdio>#include<cstring>#include<map>#include<set>#include<cmath>#include<algorithm>#include<vector>#include<queue>#include<iostream>#include<time.h>using namespace std;typedef long long ll;typedef unsigned long long ULL;#define pi acos(-1.0)#define Ex exp(1.0)#define inf 99999999#define maxn 11int dig[maxn]; //dig是为了保存数中的每一位int dp[maxn][maxn],vis[maxn][maxn]; //dp[dep][pre]表示枚举到dep位,前一位是pre,vis则代表这个dp是否被枚举过int go(int dep,int pre,int less){ if(dep<0) return 1; else if(vis[dep][pre]&&less) return dp[dep][pre]; else{ if(less){ int& tmp=dp[dep][pre]; vis[dep][pre]=1; if(pre==-1){ for(int i=0;i<10;i++){ tmp+=go(dep-1,i==0?-1:i,1); } } else{ for(int i=0;i<10;i++){ if(abs(i-pre)>1){ tmp+=go(dep-1,i,1); } } } return tmp; //这里加return tmp的作用是返回到solve函数中去。下面也是一样 } else{ int tmp=0; for(int i=0;i<=dig[dep];i++){ if(abs(i-pre)>1){ tmp+=go(dep-1,i,i!=dig[dep]); } } return tmp; } }}int solve(int x){ int len=0; while(x){ dig[len++]=x%10; x=x/10; } int ans=0; //从最高位的值开始枚举起来,这样子就可以直接在go函数中往后面推了。 for(int i=0;i<=dig[len-1];i++){ ans+=go(len-2,i==0?-1:i,i!=dig[len-1]); } return ans;}int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ printf("%d\n",solve(m)-solve(n-1)); //这里所求的是包含它本身的数位,所以是n-1 } #ifndef ONLINE_JUDGE system("pause"); #endif return 0;}/*1 25*/
0 0
- HYSBZ 1026——windy数(数位dp)
- HYSBZ:1026 windy数(数位DP)
- HYSBZ - 1026 windy数 数位DP
- HYSBZ 1026 windy数 (数位DP)
- HYSBZ 1026 windy数 数位dp
- HYSBZ - 1026 windy数 (数位DP)
- 数位DP——UESTC1307 windy数
- HYSBZ 1026windy数
- 数位DP --Windy数
- 数位DP Windy数
- 数位dp windy数
- windy数 【数位DP】
- 【数位Dp】windy数
- [bzoj 1026]windy数[数位DP]
- 数位dp BZOJ 1026: [SCOI2009]windy数
- BZOJ 1026 SCOI2009 windy数 数位DP
- bzoj 1026 windy数(数位DP)
- 【BZOJ】1026: [SCOI2009]windy数 数位DP
- IOS Apps 开发(Swift)(3)——Build a Basic UI(2)
- Linux系统硬件信息的查看
- 【poj3233】Matrix Power Series(递推+矩阵快速幂)
- matlab 随笔
- hdu3487 splay树
- HYSBZ 1026——windy数(数位dp)
- Java中几种数据类型的转化
- 替换空格
- 1039. Course List for Student (25)
- cf 629D Babaei and Birthday Cake 上升子序列最大和
- Yii2-权限控制RBAC-应用篇(二)
- C++学习笔记48——继承中的构造函数
- hdu 1890 splay树
- 通过源码安装Redis