提交时间:2026-01-04 14:25:50

运行 ID: 79543

#include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { int n, h; cin >> n >> h; int total_time = h * 12; // 将小时转换为5分钟单位 int F[30] = {0}, d[30] = {0}, t[30] = {0}; for (int i = 1; i <= n; i++) cin >> F[i]; for (int i = 1; i <= n; i++) cin >> d[i]; for (int i = 1; i <= n-1; i++) cin >> t[i]; // t[i]是从i到i+1的时间 // dp[i][j] 表示在前i个池塘,花费j个单位时间,能钓到的最大鱼数 int dp[30][400] = {0}; // 初始化,除了dp[0][0],其他都设为-1表示不可达 memset(dp, -1, sizeof(dp)); dp[0][0] = 0; int ans = 0; // 计算到达每个池塘累计需要的移动时间 int move_cost[30] = {0}; for (int i = 2; i <= n; i++) { move_cost[i] = move_cost[i-1] + t[i-1]; } // 动态规划 for (int i = 1; i <= n; i++) { // 遍历前i个池塘 for (int j = 0; j <= total_time; j++) { // 遍历总时间 // 计算纯留在第i个池塘钓鱼的时间 for (int k = 0; k <= j - move_cost[i]; k++) { // k是在当前池塘钓鱼的时间 if (dp[i-1][j - k - (i==1 ? 0 : t[i-1])] != -1) { // 计算在池塘i钓k个单位时间能得到的鱼 int fish = 0; int f = F[i]; for (int x = 0; x < k; x++) { if (f <= 0) break; fish += f; f -= d[i]; if (f < 0) f = 0; } dp[i][j] = max(dp[i][j], dp[i-1][j - k - (i==1 ? 0 : t[i-1])] + fish); } } ans = max(ans, dp[i][j]); } } cout << ans << endl; return 0; }