区间DP求调,样例过不去
查看原帖
区间DP求调,样例过不去
333724
IL_2楼主2023/4/8 14:55

样例输出

30
54

推测可能和求取最小值的dp数组minS初始化有关。

#include <bits/stdc++.h>
using namespace std;

const int M = 256;
int n;
int a[M];
int sum[M]; // 前缀和 of a
int maxS[M][M], minS[M][M]; // i-j合并后的最大/最小分数

int main()
{
    scanf("%d", &n);
    for (int i=0; i<n; i++)
    {
        scanf("%d", &a[i]);
        a[i+n] = a[i];
    }

    sum[0] = sum[n] = a[0];
    for (int i=1; i<=n*2; i++)
        sum[i] = sum[i-1]+a[i];
    
    // dp
    for (int len=2; len<=n; len++)
        for (int l=0; l<2*n; l++)
        {
            int r = l+len;
            if (r>=2*n) continue;

            minS[l][r] = INT_MAX/4;
            for (int cut=l; cut<r; cut++)
            {
                maxS[l][r] = max(
                    maxS[l][r],
                    maxS[l][cut] + maxS[cut+1][r] + (sum[r]-sum[l])
                );
                minS[l][r] = min(
                    minS[l][r],
                    minS[l][cut] + minS[cut+1][r] + (sum[r]-sum[l])
                );
            }
        }
    
    int minA=INT_MAX, maxA=0;
    for (int l=0; l<n; l++)
    {
        int r = l+n;
        minA = min(minA, minS[l][r]);
        maxA = max(maxA, maxS[l][r]);
    }

    printf("%d\n%d\n", minA, maxA);
    return 0;
}
2023/4/8 14:55
加载中...