題意:詢問乙個區間內要麼只包含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約會一次以...