hdu 4389 数位DP 模板化代码 结合记忆化搜索优化
2016-02-16 23:14
567 查看
数位DP
用的是之前的模板。之前写过的汇总:/article/8874680.html
模板: (强调一点,我的数位DP模板是结合记忆话搜索优化的,博客中之前写过的数位DP题,都是用这个模板)
int dfs(int top, int s, bool e) { if (top==0) return s==target_s; if (!e && dp[top][s]!=-1) return dp[top][s]; int i,res = 0; int u = e?num[top]:9; for (i = 0; i <= u; ++i) res += dfs(top-1, new_s(s, i), e&&i==u); return e?res:dp[top][s]=res; }
dp[i][j][k][l] i表示第几位数,j表示各位数总和,k表示余数,l 表示除多少
题目代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<cctype> #define MS(x,y) memset(x,y,sizeof(x)) using namespace std; const int MAXN = 130; //const int N = 5010; const double eps = 1e-10; void fre(){freopen("t.txt","r",stdin);} typedef long long LL; typedef unsigned long long ULL; int len,dp[10][82][82][82],num[15]; void getnum(int x) { len = 0; while(x) { num[++len] = x%10; x/=10; } } int dfs(int top, int sum, int mo, int div,bool e) { if (top==0) return mo==0 && sum == div; if (!e && dp[top][sum][mo][div]!=-1) return dp[top][sum][mo][div]; int i,res = 0,nsum,ndiv,nmo; int u = e?num[top]:9; for (i = 0; i <= u; ++i) { nsum = sum+i; res += dfs(top-1, nsum, (mo*10+i)%div, div, e&&i==u); } return e?res:dp[top][sum][mo][div]=res; } int main() { // fre(); int T,a,b,i,t = 0; scanf("%d",&T);MS(dp,-1); while(T--) { scanf("%d%d",&a,&b); int tem = 0; getnum(b); for(i = 1; i < 82; ++i) tem +=dfs(len,0,0,i,1); getnum(a-1); for(i = 1; i < 82; ++i) tem -=dfs(len,0,0,i,1); printf("Case %d: %d\n",++t,tem); } }
相关文章推荐
- Python基本数据类型
- Python基本数据类型
- Spring Ioc原理
- 定制化Azure站点Java运行环境(1)
- php笔记
- java学习笔记-cmd执行java程序
- 折半查找法
- hdu 5470 Typewriter
- python基础第四天(1)
- java 正则表达式、Pattern和Matcher详解
- 深入理解JVM—Java 6 JVM参数配置说明
- 冒泡、鸡尾酒、选择、插入、归并、快速排序的C++程序
- 项目中的代码的包结构
- C语言深度解剖学习笔记
- C++纯虚函数与抽象类
- _splitpath 或_wsplitpath函数的使用
- java设计模式
- (java) Pow(x, n)
- 字符串处理
- java学习日记——基本操作02