题解
2023-08-17 09:41:38
发布于:广东
5阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
const int INF = 0x3f3f3f3f;
int dp[N][N][2], n, m, p, harvest[N][N], f[N][N], cost[N], ans = -INF; 
int getMax(int x, int y) { return x > y ? x : y; }
int getMin(int x, int y) { return x < y ? x : y; }
int calculate(int i, int j, int k) 
{
    return f[i - 1][j - 1] - f[i - k - 1][j - k - 1];
}
int main() 
{
    memset(dp, -INF, sizeof(dp));
    cin >> n >> m >> p;
    for (int i = 1; i <= n; i++) 
    {
        for (int j = 1; j <= m; j++) 
        {
            cin >> harvest[i][j];
            f[j][i] = f[j - 1][i - 1] + harvest[i][j];
        }
    }
    for (int i = 1; i <= n; i++)
        cin >> cost[i];
    for (int i = 1; i <= n; i++)
        dp[1][i][0] = -cost[i];
    m++;
    for (int i = 2; i <= m; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            for (int k = 1; k <= getMin(i, p); k++) 
            {
                if (j > k)
                    dp[i][j][1] = getMax(dp[i][j][1], dp[i - k][j - k][0] + calculate(i, j, k));
                else if (i > j)
                    dp[i][j][1] = getMax(dp[i][j][1], dp[i - k][n + j - k][0] + calculate(i - j + 1, n + 1, k - j + 1) + calculate(i, j, j - 1));
            }
        }
        for (int j = 1; j <= n; j++)
        {
            for (int k = 1; k <= n; k++) 
            {
                if (k == j) continue;
                dp[i][j][0] = getMax(dp[i][j][0], dp[i][k][1] - cost[j]);
            }
        }
    }
    for (int i = 1; i <= n; i++)
        ans = getMax(ans, dp[m][i][1]);
    cout << ans << endl;
    return 0;
}
加油,继续去肝下一题 ~
这里空空如也


有帮助,赞一个