首页 > 代码库 > [数位dp] lightoj 1205 Palindromic Numbers
[数位dp] lightoj 1205 Palindromic Numbers
题意:给定范围内是回文数的个数。
思路:
dp[site][len] site位的回文长度是len。
需要一个负责数组 ok存每位放的数。
然后就是dfs了,就是取len 的中间值mid
超过mid的话 就看看ok里面之前对称的那个数 判断是否相等
相等才能放进入下一位。
注意判断前导0,和这个oj必须用long long。
代码:
#include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue" #include"algorithm" #include"iostream" using namespace std; //2014年9月24日10:30:25 long long dp[22][22]; int num[22],ok[22]; long long dfs(int site,int n,int zero,int f) { if(site==0) return 1; if(!f&&!zero&&dp[site][n]!=-1) return dp[site][n]; int len=f?num[site]:9; long long ans=0; for(int i=0; i<=len; i++) { if(zero) { if(i==0) ans+=dfs(site-1,n-1,zero&&i==0,f&&i==len); else { ok[site]=i; ans+=dfs(site-1,n,zero&&i==0,f&&i==len); } } else { int mid=(n+1)/2; if(n%2) { if(site==mid) ans+=dfs(site-1,n,zero&&i==0,f&&i==len); else if(site>mid) { ok[site]=i; ans+=dfs(site-1,n,zero&&i==0,f&&i==len); } else { if(ok[n+1-site]==i) ans+=dfs(site-1,n,zero&&i==0,f&&i==len); } } else { if(site>mid) { ok[site]=i; ans+=dfs(site-1,n,zero&&i==0,f&&i==len); } else { if(ok[n+1-site]==i) ans+=dfs(site-1,n,zero&&i==0,f&&i==len); } } } } if(!f&&!zero) dp[site][n]=ans; return ans; } long long solve(long long x) { int cnt=0; while(x) { num[++cnt]=x%10; x/=10; } return dfs(cnt,cnt,1,1); } int main() { int t,cas=1; cin>>t; memset(dp,-1,sizeof(dp)); while(t--) { long long x,y; scanf("%lld%lld",&x,&y); if(x>y) swap(x,y); printf("Case %d: %lld\n",cas++,solve(y)-solve(x-1)); } return 0; } //2014年9月24日11:26:45
[数位dp] lightoj 1205 Palindromic Numbers
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。