USACO 2014 US Open Odometer /// 数位DP
题目大意:
给定区间 l r
求得区间中有多少个数 数的各个数位里出现最多次的数>=数的长度的一半 如2233 3334
枚举k在数中出现次数在一半以上 那么求出的所有方案数中应该减去 两个数各占一半的情况
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
#define gcd(i,j) __gcd(i,j);
const int N=;
const int mod=1e9+;
const double eps=1e-; LL dp[N][N][][];
// dp[i][j][b1][b2]
// i为数的第i位 j作为枚举的k出现次数的相对计数器
// b1=1当前位小于上界 =0则是等于上界
// b2=1到当前位之前全是前导0 =0则不是前导0
LL DP(char t[],int n,int k1,int k2) {
mem(dp,);
dp[][][][]=; // 初始设25 防止负数
inc(i,,n-) inc(j,,N-)
inc(b1,,) inc(b2,,) {
LL cur=dp[i][j][b1][b2];
inc(nxt,,) { // 枚举下一位
if(k2!=-) { // 说明枚举的是2233这种被两个数各占一半的情况
if(b2== || nxt!=) // 下一位不是前导0
if(nxt!=k1 && nxt!=k2) continue; // 但又不是这两种数
}
if(b1== && nxt>t[i]-'') continue;
// 当前位已经是上界 那么下一位不能超过上界
bool nb2= b2&(nxt==); // 当前位是0b2为1 下一位为0nxt==0为1 则nb2为1
int nj=j;
if(nb2==) { // 下一位不是前导0
if(nxt==k1) nj--;
else nj++;
} // 是k1就+ 不是就- 最后j=25说明k1刚好一半 如果j<25说明k1超过半数
bool nb1= b1|(nxt<t[i]-''); // 当前位之前均为上界b1=0 下一位为上界nxt<t[i]-'0'=0 则nb1为0
dp[i+][nj][nb1][nb2]+=cur;
}
}
LL res=dp[n][][][]+dp[n][][][];
if(k2==-) inc(j,,)
res+=dp[n][j][][]+dp[n][j][][];
return res;
} LL ANS(char t[],int n) {
LL res=;
inc(k,,) res+=DP(t,n,k,-); // k出现次数超过一半 如2223
inc(k1,,) inc(k2,k1+,) // k1 k2各占一半的 如2323
res-=DP(t,n,k1,k2);
return res;
} int main()
{
LL ta,tb;
while(~scanf("%lld%lld",&ta,&tb)) {
ta--;
char a[],b[];
int lena=,lenb=;
while(ta) a[lena++]=ta%+'', ta/=;
while(tb) b[lenb++]=tb%+'', tb/=;
reverse(a,a+lena); reverse(b,b+lenb);
printf("%lld\n",ANS(b,lenb)-ANS(a,lena));
} return ;
}
USACO 2014 US Open Odometer /// 数位DP的更多相关文章
- USACO 2014 US Open Odometer /// 枚举
题目大意: 给定区间 l r 求区间包含多少个数 它们各个位的数只有一个不一样 注意 多个位但多个数为0单个数为x的情况 这种情况只有 x000 即把单个数放在首位才是正确的 同样注意 多个位但单个数 ...
- [Swust OJ 1097]--2014(数位dp)
题目链接:http://acm.swust.edu.cn/problem/1097/ Time limit(ms): 1000 Memory limit(kb): 32768 今年是2014年,所 ...
- bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...
- USACO翻译:USACO 2014 US Open 三题
USACO 2014 US Open 一.题目概览 中文题目名称 牧场装饰 里程表 牛像展览 英文题目名称 decorate odometer fairphoto 可执行文件名 decorate od ...
- 浅谈数位DP
在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...
- hdu----(5045)Contest(数位dp)
Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 以前刷过的数位dp
TOJ1688: Round Numbers Description The cows, as you know, have no fingers or thumbs and thus are una ...
- POJ3252 Round Numbers —— 数位DP
题目链接:http://poj.org/problem?id=3252 Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Su ...
- poj3252 Round Numbers(数位dp)
题目传送门 Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16439 Accepted: 6 ...
随机推荐
- ubuntu vim8.1编译安装
sudo apt-get install libncurses5-dev python-dev python3-dev libgtk-3-dev libatk1.0-dev libbonoboui2- ...
- shell判断用户是否已经在系统中登录
- AR/VR增强现实 虚拟现实,嵌入式解决方案探讨
AR/VR增强现实 虚拟现实,嵌入式解决方案探讨 北京太速科技有限公司 视频增强现实产品与视频矩阵拼接等产品开发,增强现实技术包含了多媒体.三维建模.实时视频显示及控制.多传感器融合.实时跟踪及注册. ...
- 用Matlab的.m脚本文件处理实验室数据
找到相应的文件 findfile %1 打开文件夹 %2 拷贝第一个文件 %3 关闭当前文件,再次拷贝新的文件,直到文件末尾结束 clc clear DST_PATH_t = 'C:\Users\Ma ...
- CF555E Case of Computer Network
题面:https://www.luogu.com.cn/problem/CF555E 题意:给定一张\(n\)个点\(m\)条边的无向图. 给定\(q\)组有向点对\((s,t)\). 询问是否存在使 ...
- ltp-ddt wdt_test
# @name Watchdog Timer getsupport,settimeout,getstatus,keepalive ioctl and write test# @desc Watchdo ...
- bzoj4903 & loj2264 [Ctsc2017]吉夫特 Lucas 定理+状压DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4903 https://loj.ac/problem/2264 http://uoj.ac/pr ...
- LOJ6252. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡! 最短路+bitset
题目传送门 https://loj.ac/problem/6252 https://lydsy.com/JudgeOnline/problem.php?id=5109 题解 首先跑最短路,只保留 \( ...
- Maven 错误: Unknown lifecycle phase ".sourceforge.javacsv". You must specify a valid lifecycle phase or a goal
这是在Win10系统下,将Jar包手工导入进Maven本地仓库,使用PowerShell执行命令报的错. 命令如下: mvn install:install-file -Dfile=E:\Worksp ...
- Linux中的bin文件夹
~/bin适合放个人用户的 script /usr/local/bin存放系统中所有用户都可以使用的 script /usr/local/sbin存放管理员的 script /usr/local/目录 ...