多校5 HDU5787 K-wolf Number 数位DP

  1 // 多校5 HDU5787 K-wolf Number 数位DP
  2 // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d
  3 // f 用作标记,当现在枚举的数小于之前的数时,就不用判断i与dig[pos]的大小
  4 // 整体来说就,按位往后移动,每次添加后形成的数都小于之前的数,并且相邻k位不一样,一直深搜到cnt位
  5 // http://blog.csdn.net/weizhuwyzc000/article/details/52097690
  6
  7
  8
  9 // #pragma comment(linker, "/STACK:102c000000,102c000000")
 10 #include <iostream>
 11 #include <cstdio>
 12 #include <cstring>
 13 #include <sstream>
 14 #include <string>
 15 #include <algorithm>
 16 #include <list>
 17 #include <map>
 18 #include <vector>
 19 #include <queue>
 20 #include <stack>
 21 #include <cmath>
 22 #include <cstdlib>
 23 // #include <conio.h>
 24 using namespace std;
 25 #define clc(a,b) memset(a,b,sizeof(a))
 26 const double inf = 0x3f3f3f3f;
 27 #define lson l,mid,rt<<1
 28 // #define rson mid+1,r,rt<<1|1
 29 const int N = 2010;
 30 const int M = 1e6+10;
 31 const int MOD = 1e9+7;
 32 #define LL long long
 33 #define LB long double
 34 // #define mi() (l+r)>>1
 35 double const pi = acos(-1);
 36 const double eps = 1e-8;
 37 void fre(){freopen("in.txt","r",stdin);}
 38 void freout(){freopen("out.txt","w",stdout);}
 39 inline int read(){int x=0,f=1;char ch=getchar();while(ch>‘9‘||ch<‘0‘) {if(ch==‘-‘) f=-1;ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘) { x=x*10+ch-‘0‘;ch=getchar();}return x*f;}
 40
 41 LL l,r,cnt;
 42 int k;
 43 int dig[19];
 44 LL dp[19][11][11][11][11][2];
 45 int vis[19][11][11][11][11][2];
 46 int cas;
 47 LL dfs(LL pos,int a,int b,int c,int d,int f){
 48     if(pos==cnt) return 1LL;
 49     if(vis[pos][a][b][c][d][f]==cas) return dp[pos][a][b][c][d][f];
 50     vis[pos][a][b][c][d][f]=cas;
 51     LL ans=0;
 52     if(f){
 53         for(int i=0;i<10;i++){
 54             if(k==2) {if(d==i) continue;}
 55             else if(k==3) {if(d==i||c==i) continue;}
 56             else if(k==4) {if(d==i||c==i||b==i) continue;}
 57             else {if(d==i||c==i||b==i||a==i) continue;}
 58             if(i==0){
 59                 if(d==10) ans+=dfs(pos+1,a,b,c,d,f);
 60                 else ans+=dfs(pos+1,b,c,d,i,f);
 61             }
 62             else ans+=dfs(pos+1,b,c,d,i,f);
 63         }
 64     }
 65     else{
 66         for(int i=0;i<10;i++){
 67             if(k==2) {if(d==i) continue;}
 68             else if(k==3) {if(d==i||c==i) continue;}
 69             else if(k==4) {if(d==i||c==i||b==i) continue;}
 70             else {if(d==i||c==i||b==i||a==i) continue;}
 71             if(i<dig[pos]){
 72                 if(i==0){
 73                     if(d==10) ans+=dfs(pos+1,a,b,c,d,1);
 74                     else ans+=dfs(pos+1,b,c,d,i,1);
 75                 }
 76                 else ans+=dfs(pos+1,b,c,d,i,1);
 77             }
 78             else if(i==dig[pos]){
 79                 if(i==0){
 80                     if(d==10) ans+=dfs(pos+1,a,b,c,d,f);
 81                     else ans+=dfs(pos+1,b,c,d,i,f);
 82                 }
 83                 else
 84                     ans+=dfs(pos+1,b,c,d,i,f);
 85             }
 86         }
 87     }
 88     return dp[pos][a][b][c][d][f]=ans;
 89 }
 90
 91 bool ck(){
 92     for(int i=0;i<cnt;i++){
 93         for(int j=i-1;j>=max(0,i-k+1);j--){
 94             if(dig[i]==dig[j]) return false;
 95         }
 96     }
 97     return true;
 98 }
 99 int tem[19];
100 int main(){
101     while(~scanf("%I64d%I64d%d",&l,&r,&k)){
102         cnt=0;
103         while(r) tem[cnt++]=r%10,r=r/10;
104         int k=0;
105         for(int i=cnt-1;i>=0;i--) dig[k++]=tem[i];
106         cas++;
107         LL ans1=dfs(0,10,10,10,10,0);
108         cnt=0,k=0;
109         while(l) tem[cnt++]=l%10,l=l/10;
110
111         for(int i=cnt-1;i>=0;i--) dig[k++]=tem[i];
112         cas++;
113         LL ans2=dfs(0,10,10,10,10,0);
114         if(ck()) ans2--;
115         printf("%I64d\n",ans1-ans2);
116     }
117     return 0;
118 }
时间: 2024-10-24 00:06:32

多校5 HDU5787 K-wolf Number 数位DP的相关文章

Hdu3079Balanced Number数位dp

枚举支点,然后就搞,记录之前的点的力矩和. #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <s

SPOJ MYQ10 Mirror Number 数位dp&#39;

题目链接:点击打开链接 MYQ10 - Mirror Number A number is called a Mirror number if on lateral inversion, it gives the same number i.e it looks the same in a mirror. For example 101 is a mirror number while 100 is not. Given two numbers a and b, find the number

hdu 5898 odd-even number 数位DP

odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 716    Accepted Submission(s): 385 Problem Description For a number,if the length of continuous odd digits is even and the length

hdu_5787_K-wolf Number(数位DP)

题目链接:hdu_5787_K-wolf Number 题意: 给你一个区间,让你找满足任意k个数位内都没有相同的数字的个数 题解: 因为k不大,就直接将当前pos的前k-1个数传进去就行了 1 #include<cstdio> 2 #include<cstring> 3 int dig[20],len,k; 4 long long dp[20][11][11][11][11][2]; 5 6 long long dfs(int pos,int pre[],bool inf,boo

hdu 5787 K-wolf Number 数位dp

数位DP 神模板 详解 为了方便自己参看,我把代码复制过来吧 // pos = 当前处理的位置(一般从高位到低位) // pre = 上一个位的数字(更高的那一位) // status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回, // 给计数器+1. // limit = 是否受限,也即当前处理这位能否随便取值.如567,当前处理6这位, // 如果前面取的是4,则当前这位可以取0-9.如果前面取的5,那么当前 // 这位就不能随便取,不然会超出这个数的范围,所以如果前面取

codeforces Hill Number 数位dp

http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits:  200000 KB 64-bit interger IO format:  %lld   Java class name:  Main Description A Hill Number is a number whose digits possibly rise and then possibl

hdu3709---Balanced Number(数位dp)

Problem Description A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. More specifically, imagine each digit as a box with weight indicated by the digit. When a pivot is placed at some digit of the nu

HDU 3709 Balanced Number (数位DP)

Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 3798    Accepted Submission(s): 1772 Problem Description A balanced number is a non-negative integer that can be balanced if a pi

fzu 2109 Mountain Number 数位DP

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2109 题意: 如果一个>0的整数x,满足a[2*i+1] >= a[2*i]和a[2*i+2],则这个数为Mountain Number. 给出L, R,求区间[L, R]有多少个Mountain Number. 思路: 数位DP,判断当前是偶数位还是奇数位(从0开始),如果是偶数位,那么它要比前一个数的值小, 如果是奇数位,那么它要比前一个数的值大. 1 #include <iostream>