1. 程式人生 > 其它 >題解 P6191 【[USACO09FEB]Bulls And Cows S】

題解 P6191 【[USACO09FEB]Bulls And Cows S】

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;
	}