hdu 3886 Final Kichiku “Lanlanshu” 数位DP
2013-09-24 14:49
295 查看
思路:
dp[i][j][k]:满足在字符串的j位,前一位数字是k。
代码如下:
View Code
dp[i][j][k]:满足在字符串的j位,前一位数字是k。
代码如下:
#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\n",(solve(b,0)-solve(a,1)+M)%M); } return 0; }
View Code
相关文章推荐
- hdu 3886 Final Kichiku “Lanlanshu(数位DP进阶)
- hdu 3886 Final Kichiku “Lanlanshu” (数位dp)
- hdu_3886_Final Kichiku “Lanlanshu”(数位DP)
- HDU 3886 Final Kichiku “Lanlanshu” 数位DP
- hdu_3886_Final Kichiku “Lanlanshu”(数位DP)
- 【HDU】3886 Final Kichiku “Lanlanshu” 数位DP
- [数位dp] hdu 3886 Final Kichiku “Lanlanshu”
- hdu 3886 - Final Kichiku “Lanlanshu”(数位dp)多校联合
- HDU - 3886 Final Kichiku “Lanlanshu”(数位DP,各种形状模板)
- HDU 3886 数位DP
- HDU-3886-数位dp
- HDU 3886 Final Kichiku “Lanlanshu” 数位DP
- hdu-4398-数位dp-X mod f(x)
- hdu 2089 不要62 数位dp
- HDU 3652 B-number 数位dp
- HDU 3555 Bomb (数位DP)
- hdu 2089 不要62(数位dp)
- HDU 3652 B-number (数位dp)
- HDU 3555 Bomb (数位DP)
- hdu 2089 不要62(简单数位dp)