HDU 3886
一开始又往打表想了。。。。不过,打表确实不好处理,转DFS。
DFS有几个要注意的问题,1、对于枚举以零开始的数。我纠结了很久,最终学习别人的方法,设一个BOOL,并且假设最高一位有零,很方便。2、当枚举到字符串最后一位的情况3、对于连续的相同字符的处理,可以当一符合字符位置移动时,枚举的指针立即移动
呃。。我的不知为何WA了。。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
#include <algorithm>
#define M 100000000
using namespace std;
const int N=110;
int dp[N][N][10];
char A[N],B[N];
char str[N];
int digit[N],lenstr; bool judge(int i,int u,int v){
if(str[i]=='/') return u<v;
if(str[i]=='-') return u==v;
if(str[i]=='\\') return u>v;
} int dfs(int len,int pos,int k,bool zero,bool flag){
if(len==0){
return pos==lenstr+1;
}
if(!flag&&dp[len][pos][k]!=-1)
return dp[len][pos][k];
int en=flag?digit[len]:9;
int ans=0;
for(int i=0;i<=en;i++){
if(zero) ans=(ans+dfs(len-1,pos,i,zero&&i==0,flag&&i==en));
else if(pos<=lenstr&&judge(pos,k,i)) ans=(ans+dfs(len-1,pos+1,i,zero,flag&&i==en));
else if(pos>1&&judge(pos-1,k,i)) ans=(ans+dfs(len-1,pos,i,zero,flag&&i==en));
ans%=M;
}
if(!flag) dp[len][pos][k]=ans;
return ans;
} int cal(char *s,bool f){
int l=strlen(s+1);
int len=0;
for(int i=l;i;i--){
digit[++len]=s[i]-'0';
}
while(digit[len]==0) len--;
lenstr=strlen(str+1);
if(f&&len>1){
for(int i=1;i<=len;i++){
if(digit[i]){
digit[i]--;
break;
}
else digit[i]=9;
}
}
return dfs(len,1,0,true,true);
}
int main(){
while(scanf("%s",str+1)!=EOF){
cin>>A+1>>B+1;
cout<<B+1<<endl;
memset(dp,-1,sizeof(dp));
printf("%08d\n",((cal(B,false)-cal(A,true))+M)%M);
}
return 0;
}
COPY别人的过的,就是这篇启发我处理前导零的问题
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define M 100000000
using namespace std;
char str[101],a[101],b[101];
int len,bit[101],dp[101][101][10];
bool ok(int i,int u,int v)
{
if(str[i]=='/') return u<v;
if(str[i]=='-') return u==v;
if(str[i]=='\\') return u>v;
}
int dfs(int pos,int j,int pre,bool h,bool f)
{
if(pos==-1) return j==len;
if(!f&&dp[pos][j][pre]!=-1) return dp[pos][j][pre];
int ans=0;
int e=f?bit[pos]:9;
for(int i=0;i<=e;i++){
if(h) ans+=dfs(pos-1,j,i,h&&i==0,f&&i==e);
else if(j<len&&ok(j,pre,i)) ans+=dfs(pos-1,j+1,i,h,f&&i==e);
else if(j>0&&ok(j-1,pre,i)) ans+=dfs(pos-1,j,i,h,f&&i==e);
ans%=M;
}
if(!f) dp[pos][j][pre]=ans;
return ans;
}
int solve(char an[],bool f)
{
int m=0,i,j=0,le=strlen(an);
while(an[j]=='0') j++;
for(i=le-1;i>=j;i--) bit[m++]=an[i]-'0';
if(f&&m>0){
for(i=0;i<m;i++){
if(bit[i]){
bit[i]--;
break;
}
else bit[i]=9;
}
}
return dfs(m-1,0,0,1,1);
}
int main()
{
int i,j,k,m,n;
while(scanf("%s",str)!=EOF){
len=strlen(str);
scanf("%s%s",a,b);
memset(dp,-1,sizeof(dp));
printf("%08d\n",(solve(b,0)-solve(a,1)+M)%M);
}
return 0;
}
HDU 3886的更多相关文章
- hdu 3886 Final Kichiku “Lanlanshu” 数位DP
思路: dp[i][j][k]:满足在字符串的j位,前一位数字是k. 代码如下: #include<iostream> #include<cstdio> #include< ...
- dfs序题目练习
参考博文:http://blog.csdn.net/qwe2434127/article/details/49819975 http://blog.csdn.net/qq_24489717/artic ...
- [HDU 2102] A计划(搜索题,典型dfs or bfs)
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
随机推荐
- 分布式设计《初尝memcached》
之前听说过高性能的分布式缓存开源工具,但一直没有真正接触过,如今接触的产品中实用到过分布式缓存.所以决定一探到底.memcached是一个优秀的开源的分布式缓存工具.也是眼下比較火热的分布 ...
- <LeetCode OJ> 326. Power of Three
326. Power of Three Question Total Accepted: 1159 Total Submissions: 3275 Difficulty: Easy 推断给定整数是否是 ...
- SUSE glibc升级为2.18过程记录
先验知识:1.运行时,动态库的装载依赖于ld-linux.so.6的实现,它查找共享库的顺序如下:(1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看(2)ld-li ...
- Redis(一)、Redis五种数据结构
Redis五种数据结构如下: 对redis来说,所有的key(键)都是字符串. 1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value. String类型是二进制安 ...
- nRF52832添加微信硬件接入服务AirSync
开发环境 SDK版本:nRF5_SDK_15.0.0 芯片:nRF52832-QFAA OS: FreeRTOS 10.0.0 测试APP:AirSyncDebugger https://iot.w ...
- 第4章 部署模式 Deployment Plan(部署规划)
已开发了基于组件的应用程序,该应用程序在逻辑上构造为多层结构,如 Three-Layered Services Application. 中所述.您希望将它分布到一组在物理上为多级结构的服务器上,如 ...
- python 模块导入详解
本文不讨论 Python 的导入机制(底层实现细节),仅讨论模块与包,以及导入语句相关的概念.通常,导入模块都是使用如下语句: import ... import ... as ... from .. ...
- Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build*解决办法
easy_install -U setuptools or pip install ipython 亲测有效
- javascript中经典继承的兼容写法
function create(obj) { // 2.1 判断浏览器支持不支持 Object.create // 如果支持,直接使用 Object.create // 如果不支持,自己实现 if(O ...
- jQuery中样式和属性模块简单分析
1.行内样式操作 目标:扩展框架实现行内样式的增删改查 1.1 创建 css 方法 目标:实现单个样式或者多个样式的操作 1.1.1 css方法 -获取样式 注意:使用 style 属性只能获取行内样 ...