hdu5787 数位dp
2017-04-08 16:19
239 查看
pos表示的是当前处理的是第几位,最低位是0位,abcd表示相邻的四位(一共五位) d是最后一位,就是最远的那位,主要熟悉递归流程,记忆化搜索
#include<stdio.h> #include<iostream> #include<map> #include<math.h> #include<string.h> #include<algorithm> using namespace std; typedef long long ll; int K,num[22]; ll dp[22][11][11][11][11]; bool check(int p1,int p2,int p3,int p4,int u){ if(K==2) return u!=p4; else if(K==3) return u!=p4 && u!=p3; else if(K==4) return u!=p4 && u!=p3 && u!=p2; else return u!=p4 && u!=p3 && u!=p2 && u!=p1; } ll dfs(int pos,int p1,int p2,int p3,int p4,int flag){ // cout <<pos << " "<< p1 <<" " << p2 << " " << p3 << " " << p4 << endl; // cout << "flag = " << flag << endl; // system("pause"); if(pos==0) return p4!=10; if(!flag && ~dp[pos][p1][p2][p3][p4]) return dp[pos][p1][p2][p3][p4]; ll res=0; int ed=flag?num[pos]:9; for(int u=0;u<=ed;u++){ if(p4==10 && u==0) res+=dfs(pos-1,10,10,10,10,flag&&ed==u);//只是最开始的时候会这样,到底返回后才能 //从1开始继续 , 然后1 10 10 10 0递归 结束了之后就变为 for循环+1 1 10 10 10 1了 else if(check(p1,p2,p3,p4,u)) res+=dfs(pos-1,p2,p3,p4,u,flag&&ed==u);//因为递归是前面确定了后,处理后面的,是为了判断标志用的,所以 //应该是上一位到上限且这一位也到上限 } if(!flag) dp[pos][p1][p2][p3][p4]=res; return res; } ll solve(ll x){ int len=0; while(x){ num[++len]=x%10; x=x/10; } return dfs(len,10,10,10,10,1); } int main() { ll l,r; while(~scanf("%lld%lld%d",&l,&r,&K)){ memset(dp,-1,sizeof(dp)); // cout << solve(r) << endl; cout<<solve(r)-solve(l-1)<<endl; } }
相关文章推荐
- HDU5787 K-wolf Number(数位DP)
- hdu5787 数位dp 数位压缩
- hdu5787 K-wolf Number【数位dp】
- [2016ACM多校] HDU5787 数位DP
- hdu5791Two dp hdu5781ATM Mechine 概率dp hdu5787 K-wolf Number 数位dp
- [暑假集训--数位dp]hdu5787 K-wolf Number
- hdu5787 数位dp
- hdu5787(数位dp)
- hdu5787 数位DP
- _bzoj1026 [SCOI2009]windy数【数位dp】
- HDU 5642 King's Order【数位dp】
- 51nod 1042 数字0-9的数量 数位DP
- HDU 6148 数位dp
- 数位dp_HDU_3943_K-th Nya Number
- HDU 6148 数位dp
- cf Beautiful numbers(数位dp)
- HDOJ2089 不要62(数位DP)
- HDU Word Index (数位DP)
- bnuoj 4359无爱编号(数位dp)
- 【HDU4352/ZCMU1781】XHXJ's LIS(数位DP)