2020杭电多校(三) X Number(数位dp)
时间:2020-08-01
本文章向大家介绍2020杭电多校(三) X Number(数位dp),主要包括2020杭电多校(三) X Number(数位dp)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
这题如果普通数位dp,状态不好表示,但是我们发现,一旦当dp过程中,脱离了被最高项束缚的状态后,后面的数字就可以随便填
因此我们直接用组合数dp计算,首先维护前面出现的数字的个数,之后枚举答案d出现的合法状态的次数
设计dp[][],表示前i位,不包括d,在剩余的个数中已经存了j的答案。因此我们可以枚举i后再枚举k吗,计算这个位选k次的答案。
#include<bits/stdc++.h> #define rep(i,x,n) for(int i=x;i<=n;i++) using namespace std; typedef long long ll; typedef pair<int,ll> pll; const int N=5e4+10; int c[1000][1000]; int s[N]; int d; int len; ll dp[25][25]; int cnt[N]; ll l,r; ll dfs(int pos,int limit,int lead){ if(pos==-1){ int mx=0,num=0; rep(i,0,9) if(cnt[i]>cnt[mx]) mx=i; rep(i,0,9) if(cnt[i]==cnt[mx]) num++; return mx==d&&num==1; } if(!limit&&!lead){ ll ans=0; int mx=cnt[d]; rep(i,0,9) if(i!=d) mx=max(mx,cnt[i]+1); for(int num=mx;num<=cnt[d]+pos+1;num++){ memset(dp,0,sizeof(dp)); dp[0][0]=1; rep(i,1,10){ if(i==d+1){ for(int j=0;j<=20;j++) dp[i][j]=dp[i-1][j]; continue; } for(int j=0;j<=cnt[d]+pos+1-num;j++){ for(int k=0;k<=num-cnt[i-1]-1&&j-k>=0;k++){ dp[i][j]+=dp[i-1][j-k]*c[pos+1-j+k][k]; } } } ans+=dp[10][cnt[d]+pos+1-num]; } return ans; } int up=limit?s[pos]:9; ll ans=0; for(int i=0;i<=up;i++){ if(!lead||i!=0) cnt[i]++; ans+=dfs(pos-1,limit&&i==s[pos],lead&&i==0); if(!lead||i!=0) cnt[i]--; } return ans; } void init(){ int i,j; c[0][0]=1; for(i=1;i<=20;i++){ c[i][0]=1; for(j=1;j<=i;j++){ c[i][j]=c[i-1][j]+c[i-1][j-1]; } } } ll solve(ll x){ int len=0; if(x==0){ s[0]=0; len=1; } while(x){ s[len++]=x%10; x/=10; } return dfs(len-1,1,1); } int main(){ ios::sync_with_stdio(false); init(); int t; cin>>t; while(t--){ cin>>l>>r>>d; cout<<solve(r)-solve(l-1)<<endl; } }
原文地址:https://www.cnblogs.com/ctyakwf/p/13416873.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TextView显示文本控件两种方法 TextView显示link的方法
- Java入门005~Springboot2.2.4引入freemarker模板
- TabLayout使用方法详解
- Java入门006~springboot+freemarker+bootstrap快速实现管理后台
- Java入门007~springboot+freemarker+bootstrap快速实现分页功能
- ToolBar使用方法详解
- Android 中WallpaperManager用法实例
- Android实现屏幕各尺寸的获取的示例
- Android 中ContentProvider的实例详解
- Android Intent调用 Uri的方法总结
- Android 调用发送短信的方法
- Android 开发之Dialog中隐藏键盘的正确使用方法
- Android基于HttpUrlConnection类的文件下载实例代码
- Android ListView之setEmptyView正确使用方法
- 腾讯云Linux服务器安装Mysql8并实现远程访问