日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SPOJ MYQ10 (数位DP)

發布時間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SPOJ MYQ10 (数位DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意

詢問區間[a,b]中的Mirror Number的個數,其中Mirror Number是指把它橫著翻轉后還能表示同樣的數字。

思路

注意這個可不是回文數。。除了0,1,8,別的數字翻轉過后就不是數字了。所以策略就是記憶化按位搜索,每位只搜0,1,8,最后再判斷是否回文,統計即可。這個判斷回文是個小麻煩,因為它需要和前面的位相比較,所以用一個全局數組tmp[]表示枚舉的每位的數字。 回過頭來我覺得設置全局變量似乎不是一個好方法……它應該會破壞DP數組的區間唯一性……

代碼

[cpp] #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <set> #include <stack> #include <queue> #define MID(x,y) ((x+y)/2) #define MEM(a,b) memset(a,b,sizeof(a)) #define REP(i, begin, end) for (int i = begin; i <= end; i ++) using namespace std; typedef long long LL; typedef vector VI; typedef set SETI; typedef queue QI; typedef stack SI; char num[50]; LL dp[47][47][2]; int tmp[50]; LL dfs(int pos, int start, bool flag, bool limit){ if (pos==-1) return flag; if (!limit && ~dp[pos][start][flag]) return dp[pos][start][flag]; int end = limit?(num[pos]-48):9; LL res = 0; for (int i = 0; i <= end; i ++) if (i == 0 || i == 1 || i == 8){ bool st = (start==pos && i == 0); bool next_flag = flag; if (flag){ if (!st && pos < (start+1)/2) next_flag = (i == tmp[start-pos]); } tmp[pos] = i; res += dfs(pos-1, st?start-1:start, next_flag, limit&&(i==end)); } return limit ? res : dp[pos][start][flag] = res; } LL solve(char x[]){ int len = strlen(x); for (int i = 0; i < len; i ++){ num[i] = x[len-1-i]; } num[len] = 0; return dfs(len-1, len-1, 1, 1); } int main(){ //freopen("test.in", "r", stdin); //freopen("test.out", "w", stdout); int t; char a[50], b[50]; scanf("%d", &t); getchar(); MEM(dp, -1); while(t --){ scanf("%s %s", a, b); LL res = solve(b)-solve(a); int len = strlen(a); bool ok = true; for (int i = 0; i < len; i ++){ if ((a[i] != '0' && a[i] != '1' && a[i] != '8')||(a[i] != a[len-1-i])){ ok = false; break; } } if (ok) res ++; printf("%lld\n", res); } return 0; } [/cpp]

轉載于:https://www.cnblogs.com/AbandonZHANG/p/4114320.html

總結

以上是生活随笔為你收集整理的SPOJ MYQ10 (数位DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。