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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[BZOJ 1026] [SCOI 2009] Windy数 【数位DP】

發(fā)布時(shí)間:2023/12/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BZOJ 1026] [SCOI 2009] Windy数 【数位DP】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:BZOJ - 1026

?

題目分析

這道題是一道數(shù)位DP的基礎(chǔ)題,對(duì)于完全不會(huì)數(shù)位DP的我來(lái)說(shuō)也是難題..

對(duì)于詢問(wèn) [a,b] 的區(qū)間的答案,我們對(duì)詢問(wèn)進(jìn)行差分,求 [0,b] - [0,a-1] 的答案。這樣就化繁為簡(jiǎn)了。

具體過(guò)程見(jiàn)代碼中的注釋。

?

代碼

#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm>using namespace std;const int MaxBit = 13;int A, B; int f[MaxBit][11], Bit[MaxBit];inline int Abs(int a) {return a >= 0 ? a : -a; }//計(jì)算小于x的數(shù)的答案 int Get(int x) {if (x == 0) return 0;int ret = 0, l = 0;while (x) {Bit[++l] = x % 10;x /= 10;}//統(tǒng)計(jì)位數(shù)不足l位的答案 for (int i = 1; i <= l - 1; ++i) {for (int j = 1; j <= 9; ++j) {ret += f[i][j];}}//最高位可以在[1, Bit[l]-1]之間變化 for (int i = 1; i <= Bit[l] - 1; ++i) ret += f[l][i];//固定后面的(l-i)位,然后第i位可以在[0, Bit[i]-1]之間變化 for (int i = l - 1; i >= 1; --i) {for (int j = 0; j <= Bit[i] - 1; ++j) {if (Abs(j - Bit[i + 1]) >= 2) ret += f[i][j];}//無(wú)法固定第i位 if (Abs(Bit[i + 1] - Bit[i]) < 2) break;}return ret; }int main() {//f[i][j]表示第i位是j的答案數(shù) for (int i = 0; i <= 9; ++i) f[1][i] = 1;for (int i = 1; i <= 10; ++i) {for (int j = 0; j <= 9; ++j) {for (int k = 0; k <= 9; ++k) {if (Abs(k - j) >= 2) f[i][j] += f[i - 1][k];}}}scanf("%d%d", &A, &B);//對(duì)詢問(wèn)進(jìn)行差分,化繁為簡(jiǎn) printf("%d\n", Get(B + 1) - Get(A));return 0; }

  

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

總結(jié)

以上是生活随笔為你收集整理的[BZOJ 1026] [SCOI 2009] Windy数 【数位DP】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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