ccf csp-201312-4-有趣的數(動態規劃)

原試題點擊此處

動態規劃思想:
往某一位上填數字時,取決於上一位的正確填寫。
一步對,纔有可能步步對,而一步錯,則步步錯。
動態規劃過程模擬:

①每填寫一位數字,都有可能形成一種狀態 Statei

②而每一個狀態 Statei 都可以由上一個狀態 Statei-1(所加數字必須是不重複數字) 和自己本身狀態(所加數字必須是重複數字,eg.以下“+”後的數字)推導而來。

  • State0:2

  • State1:2 0 + 0/2

  • State2:2 3 + 3

  • State3:2 0 1 + 1/2

  • State4:2 0 3 或者 2 3 0 + 0/3

  • State5:2 0 1 3 或者 2 0 3 1 或者 2 3 0 1 + 1/3

代碼如下

#include<iostream>
using namespace std;
const long long mod = 1000000007;
long long sum = 0; 
long long dp[1005][6];
int main()
{
	long long n;
	scanf("%lld", &n);
	for(long long i=1; i<=n; i++){
		dp[i][0] = 1;
		dp[i][1] = (dp[i-1][0] + dp[i-1][1]*2) % mod;
		dp[i][2] = (dp[i-1][0] + dp[i-1][2]) % mod;
		dp[i][3] = (dp[i-1][1] + dp[i-1][3]*2) % mod;
		dp[i][4] = (dp[i-1][1] + dp[i-1][2] + dp[i-1][4]*2) % mod;
		dp[i][5] = (dp[i-1][3] + dp[i-1][4] + dp[i-1][5]*2) % mod;
	}
	cout<<dp[n][5]<<endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章