【拼多多】20250309筆試真題第3題記錄
因為之前坐過二維dp(后來才知道這其實叫序列dp)的題,所以看到這個題還是有一些思路的,但是這個題的關(guān)鍵點在于初始化,一定要初始化非法狀態(tài),不能一上來就初始化全為0
這題還是有收獲的
不過還是那句話,菜就多練
#include <bits/stdc++.h> using namespace std; int main(int argc, char const* argv[]) { int n = 0, m = 0; cin >> n >> m; int a[n] = {0}; for (int i = 0; i < n; i++) { cin >> a[i]; } // 在 m 分鐘內(nèi)讀完 n 頁, 每一分鐘最多讀 2 頁 if (n > 2 * m) { cout << "-1"; return 0; } double dp[n + 1][m + 1]; // dp[i][j]表示第i分鐘讀了j頁能獲取到最大知識量 // 只要在 m 分鐘內(nèi)讀完 n 頁就可以 // 最大知識量顯然為max({dp[1][n], dp[2][n], dp[3][n], ... dp[m][n]}) // 關(guān)鍵的初始化 // dp[i][j] = -1 表示不合法狀態(tài), 比如說 1 分鐘最多讀完第 2 頁, 不可能讀完第 3 頁 for (int i = 1; i <= m; i++) { for (int j = 1; j <=n; j++) { dp[i][j] = -1.0; } } // 第 0 分鐘讀完 0 頁獲得的知識量為 0.0 dp[0][0] = 0.0; for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { // 注意這里一開始的 i = j = 1 // 也就是dp[1][1] 表示第 1 分鐘讀完第 1 頁能獲得的最大知識量 // 只讀一頁且狀態(tài)合法 if (dp[i - 1][j - 1] > -1) { dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + a[j - 1]); } // 讀 2 頁且狀態(tài)合法 else if (j > 1 && dp[i - 1][j - 2] > -1) { dp[i][j] = max(dp[i][j], dp[i - 1][j - 2] + (a[j - 1] + a[j - 2]) / 2); } } } double ans = 0.0; for (int i = 1; i <= m; i++) { ans = max(ans, dp[i][n]); } cout << fixed << setprecision(1) << ans; system("pause"); return 0; }