1. 程式人生 > >不要62 hdu 2089 dfs記憶化搜索

不要62 hdu 2089 dfs記憶化搜索

記憶化搜索 模板 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 (int
d = 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記憶化搜索