# 数位DP入坑
Posted lovewhy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# 数位DP入坑相关的知识,希望对你有一定的参考价值。
Hdu 2089 不要62
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; inline int read() { char c=getchar();int num=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar()) num=num*10+c-‘0‘; return num; } const int N=1e6+5; int n,m; int a[20],dgt; int f[20][2; int dfs(int dep,int pre,int sta,bool lim) { if(!dep) return 1; if(!lim&&f[dep][sta!=-1) return f[dep][sta]; int up=lim?a[dep]:9; int ans=0; for(int i=0;i<=up;++i) { if(i==4) continue; if(pre==6&&i==2) continue; ans+=dfs(dep-1,i,i==6,lim&&i==a[dep]); } if(!lim) f[dep][sta]=ans; return ans; } int solve(int x) { for(dgt=0;x;a[++dgt]=x%10,x/=10); return dfs(dgt,0,0,1); } int main() { while(1) { memset(f,-1,sizeof(f)); n=read(),m=read(); if(!n&&!m) break; cout<<solve(m)-solve(n-1)<<‘ ‘; } return 0; }
Hdu 6148 Valley Numer
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; inline int read() { char c=getchar();int num=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar()) num=num*10+c-‘0‘; return num; } const int N=105; const int mod=1e9+7; int T,n; char a[N]; int f[N][10][3]; int dfs(int dep,int pre,int turn,bool lim,bool invalid) { if(dep==n+1) return invalid?0:1; if(!lim&&f[dep][pre][turn]!=-1) return f[dep][pre][turn]; int up=lim?a[dep]-=‘0‘:9; int ans=0; for(int i=0;i<=up;++i) { if(turn==2&&i<pre) continue; int p=0; if(invalid) p=0; else if(i>pre) p=2; else if(i<pre) p=1; else p=turn; ans+=dfs(dep+1,i,p,lim&&i==a[dep],invalid&&i==0); ans%=mod; } if(!lim) f[dep][pre][turn]=ans; return ans; } int main() { T=read(); while(T--) { memset(f,-1,sizeof(f)); scanf("%s",a+1); n=strlen(a+1); cout<<dfs(1,0,0,1,1)<<‘ ‘; } return 0; }
以上是关于# 数位DP入坑的主要内容,如果未能解决你的问题,请参考以下文章