这个题目呢就是一个递推的题目,想到了递推就比较简单啦。但是要小心一点的是,千万要注意数据的范围,开__int64防止溢出。
好啦,我就不废话了,直接上代码:(只写了处理函数的关键部分的代码)
代码部分有递推部分的理解哦
__int64 dp[46][5]; //第一维是有多少位的意思,第二维是最后一位可以填什么的意思
__int64 sum[46]; //长度为n的有多少种填法
//预处理出所有的结果
//还有这个题目注意要小心溢出
void init(){
dp[1][1]=dp[1][2]=dp[1][3]=dp[1][4]=1; //当长度为1情况肯定都是可以填的
sum[1]=4;
for(int i=2;i<=45;i++){
dp[i][1]=dp[i-1][2]+dp[i-1][3]; //第i位为1那么第i-1位就可以填2和3
dp[i][2]=dp[i-1][1]+dp[i-1][3]+dp[i-1][4]; //第i位为2那么第i-1位就可以填1 3 4
dp[i][3]=dp[i-1][2]+dp[i-1][1]+dp[i-1][4]; //第i位为3那么第i-1位就是可以填 1 2 4
dp[i][4]=dp[i-1][3]+dp[i-1][2]; //第i位为4那么第i-1位就是可以填2 3
sum[i]=dp[i][1]+dp[i][2]+dp[i][3]+dp[i][4]; //直接求和
}
}
很棒呢,继续加油哦,我们明天再见!