思路
经过长时间琢磨题解之后,我理解了dalao们的想法。这道题使用一维即可,但是O(n^3)的时间复杂度确实惊人。奈何我太菜了,只能理解这一种,那我也就只能来写写n^3的题解了。
转移方程:F[i] = max(F[i], F[i-k] + sum – cost[curt],其中i表示当前的时间,k表示目前设置的机器人的步数,sum代表累积起来的金币,curt表示当前机器人的编号。其中当curt = 0时,curt需要被设置成n(环形特征)。答案储存在F[m]。
代码
// P1070.cpp #include <iostream> #include <cstdio> using namespace std; const int maxn = 2020; int table[maxn][maxn]; int cost[maxn]; int F[maxn]; int n, m, p; int main() { cin >> n >> m >> p; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> table[i][j]; for (int i = 1; i <= n; i++) cin >> cost[i]; fill(F, F + maxn, -(1e9)); F[0] = 0; for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) { int curt = j - 1; if (curt == 0) curt = n; int sum = table[curt][i]; for (int k = 1; k <= p; k++) { if (i - k < 0) break; F[i] = max(F[i], F[i - k] + sum - cost[curt]); curt--; if (curt == 0) curt = n; sum += table[curt][i - k]; } } cout << F[m]; return 0; }
写到这道题,巡回一下,感谢julao
这个xc,他就是逊啦!
这个cx就是巨啦!谢谢神仙