zoukankan      html  css  js  c++  java
  • ZJOI2010 数字计数【数位dp】

    题目链接

    题目解析

    稍微有点难度的数位(dp)

    这道题的话,你发现前导零需要特判一下,不然你就会把前导零数到(0)的个数里面去。

    然后就是状态定义的不同 这道题把计数(sum)也放在记忆化数组里面了,理由详见代码注释。

    如果不好判断的话,在空间足够的的情况下 ,把(dfs)里面的参数全部记忆化总没错(点头


    ►Code View

    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    using namespace std;
    #define N 15
    #define MOD 1000000007
    #define INF 0x3f3f3f3f3f3f3f3f
    #define LL long long
    LL rd()
    {
    	LL x=0,f=1;char c=getchar();
    	while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
    	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48); c=getchar();}
    	return f*x;
    }
    int d[N],n=0;
    LL f[N][N][2][2];//f[i][j][m][p] 当前位数到i 当前数位dig有j个 后面两维是最高位和前导零 一共有多少个dig 
    /*
    关于状态为什么要记录当前状态表示出来的数的dig个数
    可以想一下如果去掉会怎么样 或者是想一下不同的sum之间有无区别 因为是记忆化嘛 
    发现是有区别的 因为在dp的时候 这个状态会拿去更新别人
    而sum不同代表你前面枚到的数不一样 那么你拿去更新别人的时候 对别人的sum的贡献不一样 
    如果全部混为一谈 答案会算多
    
    而dp值是相当于整个dfs树的子树答案和 也就是做到这一位的答案总数 
    */ 
    LL dfs(int dig,int p,int ld,int s,int sum)//有前导零ld=1
    {
    	if(p==0) return sum;
    	if(f[p][sum][ld][s]!=-1) return f[p][sum][ld][s];
    	LL res=0;
    	int lim=9;
    	if(s==1) lim=d[p];
    	for(int i=0;i<=lim;i++)
    	{
    		int del=0;
    		if(i==0&&dig==0&&ld) del=0;
    		else if(i==dig) del=1;
    		res+=dfs(dig,p-1,ld&(i==0),s&(i==d[p]),sum+del);
    	}
    	return f[p][sum][ld][s]=res;
    }
    LL solve(LL x,int dig)
    {
    	n=0;
    	while(x)
    	{
    		d[++n]=x%10;
    		x/=10;
    	}
    	memset(f,-1,sizeof(f));
    	return dfs(dig,n,1,1,0);
    }
    int main()
    {
    	LL a=rd(),b=rd();
    	for(int i=0;i<=9;i++)
    		printf("%lld ",solve(b,i)-solve(a-1,i));
    	return 0;
    }
    
    
  • 相关阅读:
    mysql 安装及基本点
    logback中的additivity属性
    chrome中,拖动.crx无响应
    Java安装
    mysql多表连接的几种写法
    Ionic -- Refresher & InfiniteScroll 下拉刷新与滚动懒加载
    ng-cli + ionic-cli 常用命令
    Vue笔记(五):Vuex
    JavaScript设计模式(三):发布—订阅模式(观察者模式)
    Windows下解决项目未正确关闭引起的nodejs端口占用
  • 原文地址:https://www.cnblogs.com/lyttt/p/14085920.html
Copyright © 2011-2022 走看看