hdu5787 数位dp
来源:互联网 发布:驾考预约软件 编辑:程序博客网 时间:2024/06/05 02:11
题意是给你一个l,r,问你这中间的数字有几个符合K位数字全都不一样。
这题比较明显的数位dp dp[pos][p1][p2][p3][p4] pos表示当前位,p4表示前一位。这里要考虑前导0的情况,p4=10的时候表示前一位为0.
档(p4==10 && u==0)时表示当前的这位为0并且前四位都为0.所以向下dfs的话 res+=dfs(pos-1,10,10,10,10,flag&&ed==u)
#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){ 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); 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)-solve(l-1)<<endl; } }
0 0
- hdu5787 数位dp
- hdu5787 数位dp
- hdu5787 数位DP
- hdu5787 数位dp 数位压缩
- HDU5787 K-wolf Number(数位DP)
- [2016ACM多校] HDU5787 数位DP
- hdu5787 K-wolf Number【数位dp】
- hdu5791Two dp hdu5781ATM Mechine 概率dp hdu5787 K-wolf Number 数位dp
- 数位dp
- 数位DP
- 数位DP
- 数位dp
- 数位dp
- 数位dp
- 数位DP
- 数位dp
- 数位DP
- 【数位DP】
- LightOJ 1043 Triangle Partitioning
- Tween 静态动态加载
- 数据完整性约束
- zabbix配置问题
- 顺序表应用2:多余元素删除之建表算法
- hdu5787 数位dp
- struts学习遇到问题之一 action
- Codeforces Round #368 (Div. 2) A Brain's Photos(水)
- scrollview 包裹ListView recyclerview 为什么会不显示
- STL算法之移除性算法
- 字典树
- SDUT OJ 3377数据结构实验之查找五:平方之哈希表
- 免费下载电子书攻略
- Opencv Mat矩阵中data、size、depth、elemSize、step等属性的理解