Password
题目描述
Eric喜欢使用数字1,2,3,4作为密码,而且他有个怪癖,相邻数字不能相同,且相差不能超过2。当然只用数字做密码,会比较弱,Eric想知道当长度为n时,这样的密码有多少种?
输入
第一行是一个整数T(1≤T≤45),表示样例的个数。 每行一个样例,为整数n(1≤T≤45)。
输出
每行输出一个样例的结果。
样例输入
5 1 2 3 4 5
样例输出
4 10 26 66 170
用动态规划解决
#include<stdio.h>
//dp[i][j]代表i=n,当前数字为j的动态规划数组
long long countPassWord(int n){
long long dp[n+1][5];
int i,j;
for(i=1;i<=4;i++)
{
dp[1][i]=1;
}
for(i=2;i<=n;i++)
{
for(j=1;j<=4;j++)
{
if(j==1)
dp[i][j]=dp[i-1][2]+dp[i-1][3];
else if(j==2)
dp[i][j]=dp[i-1][1]+dp[i-1][3]+dp[i-1][4];
else if(j==3)
dp[i][j]=dp[i-1][1]+dp[i-1][2]+dp[i-1][4];
else if(j==4)
dp[i][j]=dp[i-1][2]+dp[i-1][3];
}
}
long long total=0;
for(i=1;i<=4;i++)
{
total+=dp[n][i];
}
return total;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
long long result=countPassWord(n);
printf("%I64d\n",result);//注意oj系统需用I64d输出,lld不行
}
return 0;
}
从后往前看,只考虑当前的上一个。