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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值