不要62 hdu 2089 dfs記憶化搜索
阿新 • • 發佈:2018-02-24
記憶化搜索 模板 ngx esp algo i+1 php 生活 ron
題目:http://acm.hdu.edu.cn/showproblem.php?pid=2089
題意:
給你兩個數作為一個閉區間的端點,求出該區間中不包含數字4和62的數的個數
思路:
數位dp中的 dfs 記憶化搜索方法解。
模板:
int dfs(int i, int s, bool e) { if (i==-1) return s==target_s; if (!e && f[i][s] != -1) return f[i][s]; int res = 0; int u = e?num[i]:9; for (intd = first?1:0; d <= u; ++d) res += dfs(i-1, new_s(s, d), e&&d==u); return e?res:f[i][s]=res; }
f為記憶化數組 ;
i為當前處理串的第i位(權重表示法,也即後面剩下i+1位待填數);
s為之前數字的狀態(如果要求後面的數滿足什麽狀態,也可以再記一個目標狀態t之類,for的時候枚舉下t);
e表示之前的數是否是上界的前綴(即後面的數能否任意填)。
代碼如下:
#include <cstring> #include <iostream> #include<algorithm> using namespace std; int a, b, shu[20], dp[20][2]; int dfs(int len, bool if6, bool shangxian) { if (len == 0) return 1; if (!shangxian && dp[len][if6]) return dp[len][if6]; int cnt = 0, maxx = (shangxian ? shu[len] : 9); for (int i = 0; i <= maxx; i++) {if (if6 && i == 2 || i == 4) continue; cnt += dfs(len - 1, i == 6, shangxian && i == maxx); } return shangxian ? cnt : dp[len][if6] = cnt; } int solve(int x) { memset(shu, 0, sizeof(shu)); int k = 0; while (x) { shu[++k] = x % 10; x /= 10; } return dfs(k, false, true); } int main() { while (cin >> a >> b, a&&b) cout << solve(b) - solve(a - 1) << endl; return 0; }
感謝您的閱讀,生活愉快~
不要62 hdu 2089 dfs記憶化搜索