[go: up one dir, main page]

xtu oj 1331 密码

 题目还是不复制了,自己去看

此题为动态规划。

我的AC代码思路还是一眼就可以看出来的,不废话,直接上代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll ans[46] = {0}, dp[46][5] = {0};
int main() {
	int t;
	cin >> t;
	ans[1] = 4;
	dp[1][1] = 1;
	dp[1][2] = 1;
	dp[1][3] = 1;
	dp[1][4] = 1;
	int i;
	for (i = 2; i < 46; i++) {
		dp[i][1] = dp[i - 1][2] + dp[i - 1][3];
		dp[i][2] = dp[i - 1][1] + dp[i - 1][3] + dp[i - 1][4];
		dp[i][3] = dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][4];
		dp[i][4] = dp[i - 1][2] + dp[i - 1][3];
		ans[i] += dp[i][1] + dp[i][2] + dp[i][3] + dp[i][4];
	}
	while (t--) {
		int n;
		cin >> n;
		cout << ans[n] << endl;
	}
	return 0;
}

解释一下,n=1时,只有1,2,3,4这四种情况,即1+1+1+1。

n=2时,我们假设第一位上仍为1,2,3,4,此时看第二位的情况:

1->2,3

2->1,3,4

3->1,2,4

4->2,3

不难看出情况种类为2+3+3+2,且n位为1,4时对应n+1位为两种可能,n位为2,3时对应n+1位为三种情况.

依此类推,n=3时我们只需确定第三位情况(一二位情况在n=1,2时已得出),可能性分别为

(3+3)+(2+3+2)+(2+3+2)+(3+3)=26种。

由上述可得,此题为动规,且递归方程如下:

        dp[i][1] = dp[i - 1][2] + dp[i - 1][3];
		dp[i][2] = dp[i - 1][1] + dp[i - 1][3] + dp[i - 1][4];
		dp[i][3] = dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][4];
		dp[i][4] = dp[i - 1][2] + dp[i - 1][3];

动动小手点歌赞趴,关注也是可以的哦~~

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值