動態規劃思想:
往某一位上填數字時,取決於上一位的正確填寫。
一步對,纔有可能步步對,而一步錯,則步步錯。
動態規劃過程模擬:
①每填寫一位數字,都有可能形成一種狀態 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;
}