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 ...
随机推荐
- graphviz.js划线操作
digraph A{ graph[color=red bgcolor="cadetblue" label="海阔天空",fontname="FangS ...
- <vim实用技巧>学习笔记
第三章插入模式 1.插入模式下的删除 2.返回普通模式 3.复制 yt, //复制当前光标到逗号(,)之前的内容 第四章 可视模式 1 ...
- Linux - 进程与内存查看
top NI表示进程的优先级. -20的优先级,非常的高. top -p xxx 可以查看具体的进程情况. renice -n -6 进程ID 可以改变一个正在运行的pid的优先级. [root@lo ...
- 2017-3-11 leetcode 217 219 228
ji那天好像是周六.....吃完饭意识到貌似今天要有比赛(有题解当然要做啦),跑回寝室发现周日才开始233333 =========================================== ...
- 什么是递归?用十进制转二进制的Python函数示例说明
先上用Python写的十进制转二进制的函数代码: def Dec2Bin(dec): result = '' if dec: result = Dec2Bin(dec//2) return resul ...
- Codeforces Round #455
Generate Login 第二个单词肯定只取首字母 Solution Segments 从1开始的线段和在n结束的线段各自凑一凑,剩下的转化为规模为n-2的子问题. Solution Python ...
- Educational Codeforces Round 35
Nearest Minimums 相同的数里最小的数里的最小距离 Solution Two Cakes Solution Three Garlands 瞎比试 Solution Inversion C ...
- sql多表关联
inner join(等值连接) 只返回两个表中联结字段相等的行 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有 ...
- (转)RabbitMQ学习之消息可靠性及特性
http://blog.csdn.net/zhu_tianwei/article/details/53971296 下面主要从队列.消息发送.消息接收方面了解消息传递过的一些可靠性处理. 1.队列 消 ...
- JavaScript创建对象的几种 方式
//JavaScript创建对象的七种方式 //https://xxxgitone.github.io/2017/06/10/JavaScript%E5%88%9B%E5%BB%BA%E5%AF%B9 ...