題解 P6191 【[USACO09FEB]Bulls And Cows S】
阿新 • • 發佈:2021-12-15
Bulls And Cows題解
ello 我們來看下這道題
看到這道題,一般不是很容易想到dp,尤其是初學者。
因為dp在初學者(起碼是我)印象中是專門處理最優解問題的。
但是,dp其實還可以處理一下問題:
- 最優解
- 總和
- 判斷對錯
- ....
題目分析
既然提到了dp,那麼我們就開始順著dp的方向想。
首先,我們需要考慮第一步選擇是啥。
如何考慮這個問題?
- 其實這道題你可以考慮最後一個位置(或者第一個位置)放奶牛還是公牛
這就是我們的第一步選擇。
做出第一步選擇後,我們可以發現這個問題就轉化成了一個幾乎同樣的子問題。
為什麼?
我們分兩種情況討論:
- 第一種,如果要是最後一個位置(或者第一個位置)放的是奶牛,那麼,我們就直接考慮第n-1個位置是公牛還是母牛,因為在第n個位置放奶牛並不影響前面的任何一個位置。
- 第二種,如果要是最後一個位置(或者第一個位置)放的是公牛,那麼,我們第n-k-1個位置放公牛還是母牛,因為在第n個位置放公牛就代表著n~n-k之間的位置已經固定了。
綜上,最後的\(dp[i]\)其實就是\(dp[i-1]+dp[i-k-1]\)。
最後,還有一個問題,初始化。
我們如何考慮?
首先,我們需要知道什麼東西需要初始化。
- dp[0~k]
- 因為他們之間是不可能有>2頭公牛的。
其次,要考慮初始值。
- dp[i]=i+1
好!那現在你們應該會寫了吧...
對了,別忘了取模
關鍵程式碼:
for(int i=0;i<=k;i++) { dp[i]=i+1; } for(int i=k+1;i<=n;i++) { dp[i]+=dp[i-1]+dp[i-k-1]; dp[i]%=5000011; }