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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU 3555 Bomb (数位DP)

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

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

簡介:

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

????? 詢問[l,r]的區間內,有多少的數字滿足某個性質

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

算法核心:

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

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

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

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

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

例題:HDU 3555

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

思路:

dfs(x,pre,bo,limit)
表示當前位置,前一位的數字,當前是否已經包含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]; // 數位,前一位數,是否符合條件,是否符合限制 [從高位到低位處理] LL dfs(int x, int pre, int bo, int limit){if (x < 0) return bo; // 已經枚舉了最后一位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; // 當前受限,不能夠記憶化,也不能返回記憶化的結果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; }

轉載于:https://www.cnblogs.com/demian/p/7442215.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

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

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