LightOJ 1205 Palindromic Numbers
數位DP。。。。
Palindromic Numbers
[Submit]?? [Go Back]?? [Status]?? Description A palindromic number or numeral palindrome is a 'symmetrical' number like 16461 that remains the same when its digits are reversed. In this problem you will be given two integers?i j, you have to find the number of palindromic numbers between?i?and?j?(inclusive). Input Input starts with an integer?T (≤ 200), denoting the number of test cases. Each case starts with a line containing two integers?i j (0 ≤ i, j ≤ 1017). Output For each case, print the case number and the total number of palindromic numbers between?i?and?j?(inclusive). Sample Input 4 1 10 100 1 1 1000 1 10000 Sample Output Case 1: 9 Case 2: 18 Case 3: 108 Case 4: 198 Source Problem Setter: Jane Alam Jan[Submit]?? [Go Back]?? [Status]?? |
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm>using namespace std;typedef long long int LL;int a[70]; LL dp[70][70];LL dfs(int len,int l,int r,bool limit,bool ok) {if(l<r) return !limit||(limit&&ok);if(!limit&&~dp[len][l])return dp[len][l];LL ret=0;int mx=limit?a[l]:9;for(int i=0;i<=mx;i++){if(l==len-1&&i==0)continue;int g=ok;if(g) g=a[r]>=i;else g=a[r]>i;ret+=dfs(len,l-1,r+1,limit&&i==mx,g);}if(!limit)dp[len][l]=ret;return ret; }LL gaoit(LL n) {if(n<0) return 0;if(n==0) return 1;int len=0;while(n){a[len++]=n%10;n/=10;}LL ret=1;for(int i=len;i>=1;i--)ret+=dfs(i,i-1,0,i==len,1);return ret; }int main() {int T_T,cas=1;cin>>T_T;memset(dp,-1,sizeof(dp));while(T_T--){LL x,y;cin>>x>>y;if(x>y) swap(x,y);printf("Case %d: %lld\n",cas++,gaoit(y)-gaoit(x-1));}return 0; }
總結
以上是生活随笔為你收集整理的LightOJ 1205 Palindromic Numbers的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [NHibernate]事务
- 下一篇: POJ 2955 (区间DP)