2 条题解

  • 0
    @ 2025-10-8 16:59:03
    #include<bits/stdc++.h>
    using namespace std;
    const int N=310;
    int n, a[N], ans[N], f[N][N], root[N][N], tot; 
    struct node{int l, r;};
    deque<node> q;
    int main() 
    {
        cin >> n;
        for(int i=1; i<=n; i++) cin >> a[i];
        memset(f, 0, sizeof(f));
        for(int L=2; L<=n; L++)
        {
            for(int i=1; i<=n-L+1; i++)
            {
                int j = i + L - 1;
                for(int k=i; k<j; k++){
                    if(f[i][j] < f[i][k] + f[k+1][j] + (a[i] + a[j]) * a[k]){
                        f[i][j] = f[i][k] + f[k+1][j] + (a[i] + a[j]) * a[k];
                        root[i][j] = k;
                    }
                }
            }
        }  
        cout << f[1][n] << endl;
        q.push_back({1, n});
        while(!q.empty())
        {
            int l = q.front().l, r = q.front().r;
            int k = root[l][r];
            if(root[l][k] > 0) q.push_back({l, k});
            if(root[k+1][r] > 0) q.push_back({k+1, r});
            printf("%d ", k);
            q.pop_front();
        }
        return 0;  
    }
    
    • 0
      @ 2025-10-8 16:58:33
      #include<bits/stdc++.h>
      using namespace std;
      const int N=310;
      int n, a[N], ans[N], f[N][N],root[N][N], tot; 
      struct node{int l,r;};
      deque<node>q;
      int main() 
      {
          cin>>n;
          for(int i=1;i<=n;i++)cin>>a[i];
          memset(f,0,sizeof(f));
          for(int L=2;L<=n;L++)
          {
              for(int i=1;i<=n-L+1;i++)
              {
                  int j = i + L-1;
                  for(int k=i;k<j;k++)
                  {
                      if(f[i][j]<f[i][k]+f[k+1][j]+(a[i]+a[j])*a[k])
                      {
                          f[i][j]=f[i][k]+f[k+1][j]+(a[i]+a[j])*a[k];
                          root[i][j]=k;
                      }
                  }
              }
          }
          cout<<f[1][n]<<endl;
          q.push_back({1,n});
          while(!q.empty())
          {
          	int l=q.front().l,r=q.front().r;
          	int k=root[l][r];
          	if(root[l][k]>0)q.push_back({l,k});
          	if(root[k+1][r]>0)q.push_back({k+1,r});
          	printf("%d ",k);q.pop_front();
          }
          return 0;
      }
      • 1

      *【动态规划:区间中间推】分离与合体

      信息

      ID
      1815
      时间
      1000ms
      内存
      512MiB
      难度
      9
      标签
      递交数
      9
      已通过
      6
      上传者