AcDream 1083 完美數 數字DP

2022-05-28 07:27:09 字數 1830 閱讀 1558

題意:詢問乙個區間內要麼只包含3,要麼只包含8的數有多少個?

解法:數字dp,可惜比賽的時候忘了怎麼寫了,隨便寫了個dp沒有過,後來才調過了。正確解法是開設乙個狀態:

f[i][0]表示剩下i+1位數中且暫時不含有3,8的滿足要求的數的個數(i位數字可從全0取到全9,後同)

f[i][1]表示剩下i+1位數中且暫時只含有3的滿足要求的數的個數

f[i][2]表示剩下i+1位數中且暫時只含有8的滿足要求的數的個數

f[i][3]表示剩下i+1位數中且已經含有3和8的滿足要求的數的個數,該結果恒為零

標程的解法使用了位運算來計算狀態,非常清爽。

**如下:

#include #include 

#include

#include

#include

using

namespace

std;

int f[15][4], bit[15

];int new_s(int s, int

i) int dfs(int p, int s, int

e)

if (!e && ~f[p][s]) return

f[p][s];

int res = 0

;

int u = e ? bit[p] : 9

;

for (int i = 0; i <= u; ++i)

return e ? res : f[p][s] =res;

}int cal(int

x)

return dfs(idx-1, 0, 1);}

intmain()

puts(

"");

}return

0;

}

自己寫的搓**,但是總歸也過了:

view code

#include #include 

#include

#include

using

namespace

std;

int dp[15][10][3

];/*

dp[i][j][0] 表示第i位值為j沒有3和8的數有多少個

dp[i][j][1] 表示第i位值為j只含有3的數有多少個

dp[i][j][2] 表示第i位值為j只含有8的數有多少個

*/int bit[15

], idx;

int dfs(int pos, int num, int sta, int

full)

if (pos == 0

)

int end = full ? bit[pos-1] : 9

;

int temp = 0

;

for (int i = 0; i <= end; ++i)

else

if (sta == 1

) }

else}}

if (!full) dp[pos][num][sta] =temp;

return

temp;

}int cal(int

x)

for (int i = 0; i <= bit[idx-1]; ++i)

if (i != 3

) }

return

ret;

}int

main()

return

0;

};

隨便寫寫1 (08 3)

隨便寫寫1 最近果然又恢復超級忙的狀態了,不過相比去年要好一些,至少自己還有空來仔細研究一下設計模式。說到設計模式,的確是個好東西,雖然很久以前有接觸過,但是這次是認真仔細系統的研究,幾乎是每看一句想三分鐘的那種,還特地搞了本雙語版的,中英文對照著看。不過進度很慢罷了,這麼長時間才剛看完第一章,而且...

acdream 1056 (黑白染色)

題意 給你一些關係,每個關係是兩隻馬的名字,表示這兩個馬不能在乙個分組裡,問你能否將這些馬分成兩組。黑白染色,相鄰的點染不同顏色。bfs搞即可,水題。this code is made by wangzhili problem 1056 verdict accepted submission dat...

acdream1084(數論入門)

description 寒假又快要到了,不過對於lzx來說,頭疼的事又來了,因為眾多的後宮都指望著能和lzx約會呢,lzx得安排好計畫才行。假設lzx的後宮團有n個人,寒假共有m天,而每天只能跟一位後宮mm約會,並且由於後宮數量太過龐大了,而寒假的天數太少,所以lzx在寒假裡不會與乙個mm約會一次以...