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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU 3555 Bomb (数位DP)

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

數(shù)位dp,主要用來解決統(tǒng)計滿足某類特殊關(guān)系或有某些特點的區(qū)間內(nèi)的數(shù)的個數(shù),它是按位來進行計數(shù)統(tǒng)計的,可以保存子狀態(tài),速度較快。數(shù)位dp做多了后,套路基本上都差不多,關(guān)鍵把要保存的狀態(tài)給抽象出來,保存下來。

簡介:

顧名思義,所謂的數(shù)位DP就是按照數(shù)字的個,十,百,千……位數(shù)進行的DP。
數(shù)位DP的題目有著非常明顯的性質(zhì):

????? 詢問[l,r]的區(qū)間內(nèi),有多少的數(shù)字滿足某個性質(zhì)

做法根據(jù)前綴和的思想,求出[0,l-1][0,r]中滿足性質(zhì)的數(shù)的個數(shù),然后相減即可。

算法核心:

關(guān)于數(shù)位DP,貌似寫法還是比較多的,有遞歸的,也有非遞歸的。
下面學習一下較好理解,可拓展性較高的遞歸寫法。

LL dfs(int x,int pre,int bo,int limit);

一般需要以上參數(shù)(當然具體情況具體分析)。

  • x表示當前的數(shù)位(一般都是從高位到低位
  • pre表示前一位的數(shù)字
  • bo可以表示一些附加條件:是否有前項0,是否包含49,是否當前已經(jīng)符合條件……
  • limit這個很重要!它表示當前數(shù)位是否受到上一位的限制,比較抽象,舉例說明
    如果上限是135,前兩位已經(jīng)是1和3了,現(xiàn)在到了個位,個位只能是5以下的數(shù)字

注:如果當前受限,不能夠記憶化,也不能返回記憶化的結(jié)果
為了避免多次調(diào)用時 每次上限不同 而導致的錯亂影響

例題:HDU 3555

題意:a到b中有多少個數(shù)字包含49

思路:

dfs(x,pre,bo,limit)
表示當前位置,前一位的數(shù)字,當前是否已經(jīng)包含49,以及是否有上界
當然,直接搜索肯定TLE,f[x][pre][bo]記憶化即可。

#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int N = 20; #define LL long long int dig[N]; LL f[N][10][2]; // 數(shù)位,前一位數(shù),是否符合條件,是否符合限制 [從高位到低位處理] LL dfs(int x, int pre, int bo, int limit){if (x < 0) return bo; // 已經(jīng)枚舉了最后一位if (!limit && f[x][pre][bo] != -1) return f[x][pre][bo]; // 記憶化dpint last = limit ? dig[x] : 9; // 確定這一位的上限是多少LL re = 0;for (int i = 0; i <= last; i++)re += dfs(x - 1, i, bo || (pre == 4 && i == 9), limit && (i == last));if (!limit) f[x][pre][bo] = re; // 當前受限,不能夠記憶化,也不能返回記憶化的結(jié)果return re; } LL solve(LL n){int len = 0;while (n){dig[len++] = n % 10;n /= 10;}return dfs(len - 1, 0, 0, 1); } int main(){memset(f, -1, sizeof(f));int T; scanf("%d", &T);while (T--){LL n;cin >> n;cout << solve(n) << endl;}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/demian/p/7442215.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。