題意:n個盒子擺放成一排,當有3個以上u擺放在一起的時候,就會有危險,求總共有多少種危險的情況。
案例:sample input45
0sample output38
分析:這題思路跟之前發布的不容易事件類似。
每放置乙個新的盒子,都對應2種情況:設dp[n]=當盒子數目為n的情況下,符合要求(出現連續三個u)的放置方法的情況個數。
1. 前面n-1個盒子已經能符合要求,則第n個盒子無論是u還是l,都滿足情況。情況有(2*dp[n-1])種。
2. 前面n-1個盒子不能符合要求,即只有最後4個滿足情況luuu並且前面並沒有連續的三個u的情況才能滿足情況。有((1<<(n-4))-dp[n-4])種情況。
(1<<(n-4))為n-4個盒子放置的總情況數,dp[n-4]為n-4個盒子放置出現危險(有連續三個u出現)的情況數。最後四個盒子僅一種擺法,可忽略。
狀態轉移方程:
dp[n]=2*dp[n-1]+(1<<(n-4))-dp[n-4]
源**:
1 #include2 #include3long
long dp[100];4
intn,ans;
5int
main()614
while(scanf("
%d",&n)&&n)
15 printf("
%lld\n
",dp[n]);
16return0;
17 }
遞推,計數(危險的組合,uva 580)
dp i 是n i時的答案。此時有很多決策,即第乙個uuu放 顯然第乙個uuu最小可以從1開始放,最大可以從i 2開始放。第乙個uuu前面必須放l,然後l前面不能有uuu,因此前面的方案數為2 j dp j 後面隨便放。後面乘以前面就是這個決策的總方案數。所有決策的和加起來就是答案。includeu...
UVA 580 危險的組合(數論 計數原理)
設答案為f n 以3個u為分類依據,讓i,i 1,i 2成為3個u,這樣i前面的可以不需要3個u,但是有乙個問題,如果前i 1為u,那麼i 1,i,i 1還是可以組成3個u,這樣就不符合從第i個開始為至少3個u了,所以我們要剔除掉這種情況,可以強制讓i 1為l,這樣把i 1前面的可排列數量和i 2後...
指標的危險
指標的危險 下面的 有沒有問題?如果有的話,問題在 intarray array size int pi for pi array 0 pi array array size 有兩個錯誤。對增值後的指標進行解引用時,陣列的第乙個元素並沒有被清零。另外,指標在越過陣列的右邊界以後仍然進行解引用,它將把...