codeforces505C 記憶化搜尋

2022-08-17 07:24:19 字數 816 閱讀 5739

題目鏈結

題目大意:

現在有30000個島,最開始站在第0個島上,第一次向右跳d個島。

若上一次為d,這次只能向右跳d-1,d,和d+1步。跳的步數步數不能為0,當不能向右跳時即停止。

思路:不考慮時間和空間,最樸素的方法就是設dp[i][j]表示上一步跳了j步,當前在i點上,之後的轉移也很好寫

然而這明顯是會爆時間爆空間的,不過我們可以發現,二維的j並不需要等於30000,而只會在[d-245,d+245]這個範圍內!

最糟糕的情況,d為1,跳到第30000個島要跳的次數為n, 有等式(1 + n) * n / 2 = 30000, 解出n大約等於250;[-250, 250], 所以dp[30010][500]就夠了

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;67

const

int n = 250;8

intn, d, a;

9int dp[30010][510], val[30010];//

val[i]表示第i個島有多少寶石

10int find(int p, int f)//

p為到達的島

1122

intmain()

2330 memset(dp, -1, sizeof

(dp));

31 printf("

%d\n

", find(d, 0

));32

return0;

33 }

5 05 C語言 函式

函式是什麼?常見的庫函式都有哪些?自定義函式的一般形式是什麼?形參和實參是什麼?函式的呼叫如何實現?作業 1 動態輸入三個整數,寫乙個函式,返回最大值並輸出該值 intgetmax intx,inty,intz 2 寫乙個函式,返回輸入整數 大於 999小於 10000 的每位的數字之和。intge...

Codeforces 587C 樹上倍增

題意 求樹上兩點路徑中的前 a 10 小的點權值。思路 類似lca倍增演算法來儲存 i 2 j 路上的 前 10 小個 的點權值。然後要寫乙個權值合併 具體求 u v 的話,就是先分別計算 和 減1是lca會重疊 然後再合併,輸出答案。include include include include ...

Codeforces 976C 題解報告

對資料進行排序 1 按左邊的數從小到大排 2 若左邊的數相等,則按右邊的數從大到小排。排序之後,若乙個數的右邊的數小於等於上乙個數的右邊的數,則這兩個數必然符合題意。比如2 13 2 12 1 11排序之後,變為 1 11 2 13 2 12因為12 13,則有 2,12 被包含在它的上乙個數 2,...