动态规划思想:
往某一位上填数字时,取决于上一位的正确填写。
一步对,才有可能步步对,而一步错,则步步错。
动态规划过程模拟:
①每填写一位数字,都有可能形成一种状态 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;
}