• 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
    ",((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
    ",(solve(b,0)-solve(a,1)+M)%M);
        }
        return 0;
    }
    

      

  • 相关阅读:
    Android的计量单位px,in,mm,pt,dp,dip,sp
    android实现图片平铺效果&WebView多点触控实现缩放
    360°全景图
    为Vell001家族使用过的图标
    WordPress更新服务加快收录
    WordPress模版结构
    android权限大全
    Android强制设置横屏或竖屏
    android获取屏幕分辨率
    android用ImageView显示网络图片
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4286100.html
Copyright © 2020-2023  润新知