蓝桥杯:数列求值(动态规划)

问题描述

给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求第 20190324 项的最后 4 位数字。

答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案
4659

题解:

典型动态规划问题,我们很明显能找到其动态转移方程,不过注意的是由于项过大,因此导致这个数字也过大会致使错误,而由于我们只是要四位整数,因此我们只需要对每次得到的和求10000的余数即可,因为加法高位也不会影响低位。
为什么加法高位不会影响低位?
例如一个四位数的形成,其最先形成的是最高位,然后形成百位,十位,个位,即高位是先形成的,低位是后形成的。
因此这里我们先形成的是高位,即先突破10000的限制的位是高位,因此我们进行取余操作舍去的也是高位,与接下来的计算是无影响的,我们要的是低位。
并且注意的是第四位不能为0。

代码:

#include <bits/stdc++.h>
#define N 20190324
using namespace std;
int dp[30000000];

int main()
{
    
    
	dp[1] = 1;
	dp[2] = 1;
	dp[3] = 1;
	for(int i=4;i<=N;i++)
	{
    
    
		dp[i] = dp[i-1]%10000+dp[i-2]%10000+dp[i-3]%10000;
	}
	int temp = dp[N]%10000;
	
	cout<<temp;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xiangguang_fight/article/details/115280357