【递推】P1028 数的计算
題目鏈接:https://www.luogu.com.cn/problem/P1028
考點(diǎn):找規(guī)律,遞推
題意:
給一個(gè)整數(shù)n(n≤1000),在n左邊添加一個(gè)不大于n/2的數(shù)構(gòu)成一個(gè)新數(shù),然后對(duì)添加的數(shù)也做相同處理。統(tǒng)計(jì)所有可能性。
以10舉例,可以有以下14種可能性:
解法一(遞歸):
理解了題意之后,不難寫出遞歸的解法:
輸出:
14這個(gè)解法可以得出正確答案,但是數(shù)據(jù)大了會(huì)超時(shí)。接下來(lái)主要有兩種做法,一種是用遞歸把1000種答案算出來(lái),把答案寫在代碼里,根據(jù)輸入來(lái)輸出答案,時(shí)間復(fù)雜度是O(1),這樣做的好處是不需要?jiǎng)幽X,實(shí)在找不到規(guī)律就只能用這個(gè)笨辦法了,題目數(shù)據(jù)是1000,所以花個(gè)幾十分鐘還是可以算出來(lái)的;第二種辦法是小范圍的打印出前幾項(xiàng)答案,找規(guī)律,改用遞推公式解。
找規(guī)律的代碼:
輸出:
0:1 1:1 2:2 3:2 4:4 5:4 6:6 7:6 8:10 9:10 10:14 11:14 12:20 13:20 14:26 15:26 16:36 17:36 18:46 19:46 20:60 ...解法二(遞推):
根據(jù)以上結(jié)果,可以找出兩條規(guī)律。
規(guī)律一:當(dāng)n是奇數(shù),A[i] = A[i-1]
規(guī)律二:當(dāng)n是偶數(shù),A[i] = A[i-1] + A[i/2]
因此答案如下:
#include <bits/stdc++.h> using namespace std; int A[1005]; // 記錄答案 /* 根據(jù)題意算出前幾項(xiàng),以便找規(guī)律i 0 1 2 3 4 5 6 7 8 9 ...A[i] 1 1 2 2 4 4 6 6 10 10 ...規(guī)律一:當(dāng)n是奇數(shù),A[i] = A[i-1]規(guī)律二:當(dāng)n是偶數(shù),A[i] = A[i-1] + A[i/2] */ int main() {int n; cin >> n;A[0] = 1; A[1] = 1;for (int i = 2; i < 1000; i++) {if (i % 2 != 0) {A[i] = A[i-1];} else {A[i] = A[i-1] + A[i/2];}}cout << A[n];return 0; }這個(gè)A[i] = A[i-1] + A[i/2]我實(shí)在是想不出來(lái),不知道大佬們是怎么想到的,orz
總結(jié)
以上是生活随笔為你收集整理的【递推】P1028 数的计算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 递归输出全部组合
- 下一篇: 【素数】P1217 [USACO1.5]