55tps,求助dalao
查看原帖
55tps,求助dalao
981956
jiangsixian楼主2024/8/13 12:50

感觉自己的代码跟题解没什么区别啊qwq

// I love CCF!
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n = 0, m = 0; cin >> n >> m;
    int a[n + 10][m + 10];
    memset(a, 0, sizeof(a));
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
    
    long long dp[n + 10][m + 10][3];    //dp[i][j][0]代表从上面到a[i][j]的最大值, dp[i][j][1]代表从下面到a[i][j]的最大值, dp[i][j][2]代表从左边到a[i][j]的最大值
    memset(dp, 128, sizeof(dp));
    dp[1][1][0] = a[1][1]; dp[1][1][1] = a[1][1]; dp[1][1][2] = a[1][1];
    int i = 1, j = 1;
    for (i = 1; i <= n; i++)
    {
        dp[i][j][2] = a[i][j];
        dp[i][j][1] = a[i][j];
        if (i == 1) continue;
        dp[i][j][0] = dp[i - 1][j][0] + a[i][j];
    }
    for (j = 2; j <= m; j++)
    {
        for (i = 1; i <= n; i++)
        {
            dp[i][j][2] = max(max(dp[i][j - 1][0], dp[i][j - 1][1]), dp[i][j - 1][2]) + a[i][j];
            if (i == 1) continue;
            else dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j][2]) + a[i][j];
        }
        for (i = n; i >= 0; i--)
        {
            if (i == n) continue;
            else dp[i][j][1] = max(dp[i + 1][j][1], dp[i + 1][j][2]) + a[i][j];
        }
    }

    cout << max(dp[n][m][0], dp[n][m][2]) << endl;
    return 0;
}

2024/8/13 12:50
加载中...