AcWing 1068. 环形石子合并

题目

  • 题目链接
  • 区间DP

思路

  • 核心思路:把环形数组转换为2N长度的数组,最后求长度为N的最值。

代码


#include 
#include 
#include 

using namespace std;
const int N = 410;
int w[N], s[N];
int f[N][N], g[N][N];
int main()
{
    int n;
    cin>>n;
    for(int i = 1; i <= n; i++) {
        cin>>w[i];
        w[i+n] = w[i];
    }
    for(int i = 1; i <= 2*n; i++) s[i] = s[i-1] + w[i];
    
    memset(f, 0x3f, sizeof f);
    memset(g, -0x3f, sizeof g);
    
    //区间dp标准板子
    for(int len = 1; len <= n; len++){
        for(int l = 1; l + len - 1 <= 2*n; l++){
            int r = l + len - 1;
            if(l == r) f[l][r] = g[l][r] = 0;
            else{
                // 枚举分界点
                for(int k = l; k < r; k++){
                    f[l][r] = min(f[l][r], f[l][k] + f[k+1][r] + s[r] - s[l-1]);
                    g[l][r] = max(g[l][r], g[l][k] + g[k+1][r] + s[r] - s[l-1]);
                }
            }
        }
    }
    int minv = 0x3f3f3f3f, maxv = -0x3f3f3f3f;
    for(int i = 1; i <=n; i++){
        minv = min(minv, f[i][i+n-1]);
        maxv = max(maxv, g[i][i+n-1]);
    }
    cout<<minv<<endl<<maxv<<endl;
    return 0;
}

你可能感兴趣的:(区间DP,算法,动态规划)