# PyZ - basic DP
## QHĐ là gì?
- Đặt một mảng gì đó ($F$), cần đi tính
- Tìm một công thức để tính (thường là tính cái sau dựa vào cái trước đó)
Ví dụ đơn giản nhất là prefix-sum: `S[i] = S[i-1] + a[i]`
## Bài 1:
Các bước
- Tính $a$
- Tính `F[i] = max(F[i-1], a[i])` để trả lời các câu hỏi tìm max được nhanh
## Bài 2:
(giải thích công thức)
"một đôi thỏ con, khi tròn 2 tháng tuổi, sau mỗi tháng đẻ ra một đôi thỏ con"
Giả sử tại tháng hiện tại, có
- $x$ đôi thỏ 1 tháng tuổi
- $y$ đôi thỏ $\ge$ 2 tháng tuổi
$\Rightarrow$ Qua tháng sau, số lượng thỏ là:
- $y$ đôi thỏ 1 tháng tuổi (mới được đẻ thêm)
- $x+y$ đôi thỏ $\ge$ 2 tháng tuổi ($y$ đôi cũ + $x$ đôi mới lớn lên)
$(x,y)$ qua các tháng: $(0,1), (1,1), (1,2), (2,3), (3,5), (5,8), ...$
## Bài 4:
Cách làm tham lam sẽ bị sai test sau:
```
4
2 3 0 0
```
Hướng giải: QHĐ. Đặt `f[i]` là chi phí ít nhất để con ếch nhảy được từ $1$ tới $i$. Tính `f[i]` từ `f[i-1]` và `f[i-2]` (từ vị trí đó, nhảy thêm 1 lần tới vị trí $i$)
## Bài 3:
### Ví dụ
Tạo tổng 1: $1$
Tạo tổng 2: $1 \, 1, 2$
Tạo tổng 3:
+ có cách nào tạo được $1$?
- $1$
- thêm $2$ vào sẽ tạo được $3$
$\Rightarrow 1 \, 2$
+ có cách nào tạo được $2$?
- $1\,1 , 2$
- thêm $1$ vào sẽ tạo được $3$
$\Rightarrow 1\,1\,1 , 2\,1$
+ chỉ có số $3$
Số lượng cách là: $1 + 2 + 1 = 4$
Tạo tổng 4:
+ có cách nào tạo được $1$?
- $1$
- thêm $3$ vào sẽ tạo được $4$
$\Rightarrow 1 \, 3$
+ có cách nào tạo được $2$?
- $1\,1, 2$
- thêm $2$ vào sẽ tạo được $4$
$\Rightarrow 1\,1\,2,2\,2$
+ có cách nào tạo được $3$?
- $1\,2,1\,1\,1,\,2\,1,3$
- thêm $1$ vào sẽ tạo được $4$
$\Rightarrow 1\,1\,2, 1\,1\,1\,1,\, 2\,1\,1, 3\,1$
+ có cách nào tạo được 0?
- (không có số nào)
- thêm 4 vào
- $\Rightarrow 4$
Vậy số lượng cách $= 1 + 2 + 4 + 1$
Hay
$f[4] = f[1] + f[2] + f[3] + f[0]$
### Sol
Từ ý tưởng bài trên, ta áp dụng cho bài này.
Đặt `f[i]` là số cách tạo nên tổng $i$. Giả sử lần cuối cùng ta gieo xúc xắc ra được $j$.
Vậy tổng trước đó phải là $i-j$. Có bao nhiêu cách tạo ra được tổng $i-j$ thì sẽ có thêm bấy nhiêu cách để tạo tổng $i$. ($j$ chạy từ $1 \rightarrow 6$)
Do đó `f[i] += f[i-j]`
## Bài 5:
Tham lam hoặc QHĐ đều được