HDU3555 Bomb 題解 數字DP

2022-05-19 23:48:10 字數 1620 閱讀 7028

題目大意:求 \([1,n]\) 範圍內有多少數包含「49」。

解題思路:

這個問題我們可以分兩種解法來考慮:第一種是求不包含「49」的數的數量,用後減一下;另一種就是直接求包含「49」的數的數量。

這種方法我們先通過數字dp求出 \([0,n]\) 區間範圍內有多少數不包含「49」(假設數量為 \(x\) ),然後可以得到答案為 \(n+1-x\) 。

我們可以設計乙個函式dfs(int pos, int stat, bool limit)來返回區間 \([0,n]\) 範圍內有多少數不包含「49」,其中:

實現**如下:

#include using namespace std;

long long f[66][2], n;

int t, a[66];

void init()

long long dfs(int pos, int stat, bool limit)

if (!limit) f[pos][stat] = tmp;

return tmp;

}long long get_num(long long x)

return dfs(pos-1, 0, true);

}int main()

return 0;

}

相對解法1是間接的方式進行求解。我們現在這種方式則是直接求解 \([0,n]\) 範圍內有多少個數包含「49」。

我們可以設計乙個函式dfs(int pos, int stat, bool limit)來返回區間 \([0,n]\) 範圍內有多少數不包含「49」,其中:

雖然是一樣的,但是在處理的時候統計結果的方式卻不一樣。

這裡特別需要注意的是限制條件和非限制條件下不同的處理。

假設我們現在要找的是區間 \([0,n]\) 範圍內有多少數包含「49」 遍歷到pos位並且pos+1位是『4』,pos位是『9』,則我們可以得知:

如果當前處於限制狀態下,則之後有 \(n \% 10^ + 1\) 個數滿足條件;

如果當前處於非限制狀態下,則之後有 \(10^\) 個數滿足條件。

實現**如下:

#include using namespace std;

long long f[66][2], n;

int t, a[66];

void init()

long long pow10(int a)

long long dfs(int pos, int stat, bool limit)

else tmp += dfs(pos-1, i==4, limit && i == up);

}if (!limit) f[pos][stat] = tmp;

return tmp;

}long long get_num(long long x)

return dfs(pos-1, 0, true);

}int main()

return 0;

}

HDU 3555 Bomb 基礎數字dp

題意大致就是說給你乙個數n,要你求0 n之間含有49的數的個數 理解題意很簡單下面就直接貼 了 include include include includeusing namespace std int64 dp 21 4 int a 1000 void init int main int g 0...

hdu 3555 Bomb(數字dp初學)

題意 給定乙個n,求0到n範圍內不含49的數的個數 思路 這題是最基礎的數字dp,可模擬hdu2089 不要62,事實上,這題比不要62更簡單一些。首先,還是預處理打表,用乙個二維陣列來儲存狀態,dp i j 表示i位的滿足狀態j的數的個數,j有三種狀態,0 不含49的,1 不含49的,但是首位是9...

數字DP入門之hdu 3555 Bomb

hdu 3555 bomb 題意 在1 n 1 n 2 63 1 範圍內找出含有 49 的數的個數 與hdu 2089 不要62的區別 2089是找不不含 4 和 62 的區間範圍內的數,此題是含有 正好相反,對於 不要62 只是用第二位表示首位數字,這一題呢?看轉化 易知一定要要知道首位是9的個數...