HDU 6156 数位DP
来源:互联网 发布:9.3.3软件源 编辑:程序博客网 时间:2024/05/16 15:55
数位DP
题意:
一个10进制数字可能是一个回文串,类似的在其它进制下也可能出现回文数字,给出一个区间,问在k1进制到k2进制下有多少回文数字。
思路:
数位dp在计算的时候会考虑上下界的问题,会把问题转化为求出0到某一个区间的问题,然后按照数位进行递归求解,难点在于如何限制条件使得所问等于所求。这里用到了一个数组a,保存的是回文数字的每一位,然后在每一位是否取i值的时候直接判断即可。
- 注意的一点是边界条件:这里没有把0当做回文数字,如果需要可以特判。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;typedef long long LL;LL dp[100][40][40];int l,r,k1,k2;int a[40];int bit[100];LL dfs(int pos,int start,int k,int e1,int e2){ if(pos < 0) return e1 == 0; if(!e2 && !e1 && dp[pos][k][start] != -1) return dp[pos][k][start]; int End = e2 ? bit[pos]:k-1; LL ans = 0; for(int i = 0;i <= End; i++) { if(e1 && i == 0) { ans += dfs(pos-1,start-1,k,e1,e2&&i==End); } else { if(e1) { a[pos] = i; ans += dfs(pos-1,pos,k,0,e2&&i==End); } else if(pos < (start+1)/2) { if(i == a[start-pos]) ans += dfs(pos-1,start,k,0,e2&&i==End); } else { a[pos] = i; ans += dfs(pos-1,start,k,0,e2&&i==End); } } } a[pos] = -1; if(!e1 && !e2) dp[pos][k][start] = ans; return ans;}LL solve(int x,int k){ int pos = 0; while(x) { bit[pos++] = x%k; x /= k; } return dfs(pos-1,pos-1,k,1,1);}int main(){ //freopen("in.txt","r",stdin); int tt,ncase = 1; scanf("%d",&tt); memset(dp,-1,sizeof(dp)); while(tt--) { scanf("%d%d%d%d",&l,&r,&k1,&k2); LL ans = 0; for(int i = k1;i <= k2; i++) { LL t = solve(r,i) - solve(l-1,i); ans += t*i + (r-l+1)-t; } printf("Case #%d: %I64d\n",ncase++,ans); } return 0;}
阅读全文
0 0
- HDU 6156 数位DP
- hdu 6156 数位dp
- HDU 6156 数位DP
- HDU 6156 数位DP
- hdu 6156(数位dp)
- hdu 6156 Palindrome Function 数位DP
- HDU 6156 Palindrome Function 经典数位DP
- HDU 6156 Palindrome Function 数位DP
- Hdu 6156 Palindrome Function【数位Dp】
- HDU 6156 Palindrome Function(数位DP)
- HDU-6156 Palindrome Function(数位DP)
- HDU 6156(Palindrome Function-数位dp)
- HDU 6156 Palindrome Function (数位dp)
- HDU 6156 Palindrome Function【数位dp】
- hdu 6156 Palindrome Function(数位dp&&其他)
- hdu 6156 Palindrome Function(数位dp)
- hdu 6156 palindrome function #数位dp 3
- HDU 6156(数位DP+乱搞)
- 使用stm32CubeMX自动配置的工程文件,进行串口的不定长接收(非DMA方式)
- 【NOIP1999】拦截导弹
- fedora rpm安装时依赖包出错的问题
- G
- 汽水瓶问题(能喝多少瓶汽水)
- HDU 6156 数位DP
- MySQL学习篇--基础篇02
- 三级缓存之LruCache 学习
- ajax
- NYOJ【96】n-1位数【水题】
- JS学习笔记2-JavaScript 语法
- 51nod 1163 最高的奖励
- C++replace函数用法
- HttpClient Post提交数据