zoukankan      html  css  js  c++  java
  • HDU.3652.B-number(数位DP)

    题目链接

    (Description)
    ([1,n])中十进制表示包含"13"这个子串,且能整除13的数的个数。

    (Solution)
    数位DP: dp[位][s(pre/have"13")][remainder],上界由DFS状态记录.

    //15MS 1520K
    #include <cstdio>
    
    int n,A[13],f[13][3][13];
    bool vis[13][3][13];
    
    int DFS(int pos,int s,int mod,bool lim)
    {
    	if(!pos) return (s==2)&&(!mod);
    	if(!lim && vis[pos][s][mod]) return f[pos][s][mod];
    	int up=lim?A[pos]:9,res=0;
    	for(int i=0; i<=up; ++i)
    		if(s==2||(i==3&&s==1)) res+=DFS(pos-1,2,(mod*10+i)%13,i==up&&lim);
    		else res+=DFS(pos-1,i==1?1:0,(mod*10+i)%13,i==up&&lim);
    	if(!lim) vis[pos][s][mod]=1,f[pos][s][mod]=res;
    	return res;
    }
    int Solve(int n)
    {
    	for(A[0]=0; n; n/=10) A[++A[0]]=n%10;
    	return DFS(A[0],0,0,1);
    }
    
    int main()
    {
    	while(~scanf("%d",&n))
    		printf("%d
    ",Solve(n));
    	return 0;
    }
    
  • 相关阅读:
    数组练习
    数组
    表达式和语句
    搜索框制作
    操作DOM
    数据类型
    javascript数组属性及方法
    javascript字符串属性及常用方法总结
    css清除浮动float
    vue项目搭建步骤
  • 原文地址:https://www.cnblogs.com/SovietPower/p/8687008.html
Copyright © 2011-2022 走看看