HYSBZ - 1026 windy数 数位DP

来源:互联网 发布:淘宝宽屏 编辑:程序博客网 时间:2024/06/13 09:32

题目大意:windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?

解题思路:模板题目,初始的pre是12,保证第一位能满足

#include<cstdio>#include<cstring>#include<cmath>using namespace std;int data[12],dp[12][13];int DP(int pos,int pre,bool jud, bool board) {if(pos == -1)return 1;if(!board && dp[pos][pre] != -1)return dp[pos][pre];int ans = 0;int end = board? data[pos]:9;for(int i = 0; i <= end; i++) {if(!(jud || i)) ans += DP(pos-1,12,0,board && (i == end));else if(fabs(pre-i) >= 2)ans += DP(pos-1,i,1,board && (i == end));}if(!board)dp[pos][pre] = ans;return ans;}int solve(int x) {int pos = 0;while(x) {data[pos++] = x % 10;x = x / 10;}return DP(pos-1,12,0,1);}int main() {int left,right;memset(dp,-1,sizeof(dp));scanf("%d%d",&left,&right);printf("%d\n",solve(right) - solve(left-1));return 0;}


0 0
原创粉丝点击