D题求助

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1005;

int dp[N][N];

signed main()
{
    int n;
    cin >> n;
    vector<int> a(n + 5);
    int sum = 0;
    for (int i = 1; i <= n; i++) cin >> a[i], sum += a[i]; 
    
    for (int i = 1; i <= n; i++)
        for (int j = i; j <= n; j++)
            dp[i][j] = -1e18;
    dp[1][n] = 0;

    for (int len = n; len >= 2; len--)
    {
        for (int i = 1; i + len - 1 <= n; i++)
        {
            int j = i + len - 1;
            if ((n + len) & 1) dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + a[i]), dp[i][j - 1] = max(dp[i][j] + a[j], dp[i][j - 1]);
            else if (a[i] >= a[j]) dp[i + 1][j] = dp[i][j];
            else dp[i][j - 1] = dp[i][j];
        }
    }

    int ans = 0;

    for (int i = 1; i <= n; i++) 
    {
        if (!(n & 1)) dp[i][i] += a[i];
        ans = max(ans, dp[i][i]);
    }
    
    cout << sum - ans << " " << ans;
    
}

len如果从大到小枚举该怎么写dp 这段代码样例能过 然后只能过百分之二十的数据

全部评论
点赞 回复 分享
发布于 02-15 10:02 广东

相关推荐

喜欢核冬天的哈基米很想上市:会爆NullPointerException的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务