ブルーブリッジカップ:シーケンス評価(動的計画法)

問題の説明

項目4から始まる1、1、1、3、5、9、17、…のシーケンスが与えられると、各項目は最初の3つの項目の合計になります。アイテム20190324の下4桁を検索します。

回答提出
これは、空欄に結果を記入する質問です。結果を計算して提出するだけです。この質問の結果は4桁の整数です(ヒント:回答の1000桁は0ではありません)。回答を送信するときは、この整数のみを入力してください。余分なコンテンツを入力してもスコアは付けられません。

答案
4659

回答:

典型的な動的計画問題の場合、明らかにその動的遷移方程式を見つけることができますが、項が大きすぎるため、この数が大きすぎてエラーが発生し、4つの整数しか必要ないため、毎回修正するだけで済みます。得られた合計は、加算の上位ビットが下位ビットに影響を与えないため、10000の余りとして計算できます。
追加の上位ビットが下位ビットに影響を与えないのはなぜですか?
たとえば、4桁の数字の形成では、最初に最上位の数字が形成され、次に100、10、1の数字が形成されます。つまり、上位の数字が最初に形成され、下位の数字が後で形成されます。
したがって、ここでは最初に高位置を形成します。つまり、最初に10000の制限を超えた位置が高位置です。したがって、残りの演算を実行して破棄する高位置も高位置であり、影響はありません。次の計算。必要なのは低い位置です。
また、4番目のビットを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