4 条题解

  • 1
    @ 2026-7-29 15:55:14

    #include <bits/stdc++.h> using namespace std; const int N = 1e3 + 10; const int INF = 0x3f3f3f3f; const long long LLINF = 0x3f3f3f3f3f3f3f3fLL; int a[N], sum[N], dp[N][N]; int main(){ int n; cin >> n; for(int i = 1 ; i <= n ; i++){ cin >> a[i]; a[n + i] = a[i]; } for(int i = 2 ; i <= n + 1 ; i++){ for(int l = 1, r = i ; r <= 2 * n ; l++, r++){ for(int k = l + 1 ; k <= r - 1 ; k++){ dp[l][r] = max(dp[l][r], dp[l][k] + dp[k][r] + a[l] * a[k] * a[r]); } } } int maxx = 0; for(int i = 1 ; i <= n ; i++){ maxx = max(maxx, dp[i][i + n]); } cout << maxx << endl; return 0; }

    • -1
      @ 2026-3-27 16:01:18
      #include <bits/stdc++.h>
      using namespace std;
      const int N = 1e3 + 10;
      const int INF = 0x3f3f3f3f;
      const long long LLINF = 0x3f3f3f3f3f3f3f3fLL;
      int a[N], sum[N], dp[N][N];
      int main(){
      	int n;
      	cin >> n;
      	for(int i = 1 ; i <= n ; i++){
      		cin >> a[i];
      		a[n + i] = a[i];
      	}
      	for(int i = 2 ; i <= n + 1 ; i++){
      		for(int l = 1, r = i ; r <= 2 * n ; l++, r++){
      			for(int k = l + 1 ; k <= r - 1 ; k++){
      				dp[l][r] = max(dp[l][r], dp[l][k] + dp[k][r] + a[l] * a[k] * a[r]);
      			} 
      		}
      	}
      	int maxx = 0;
      	for(int i = 1 ; i <= n ; i++){
      		maxx = max(maxx, dp[i][i + n]);
      	}
      	cout << maxx << endl;
      	return 0;
      } 
      
      • -1
        @ 2023-9-9 12:41:57
        #include <iostream>
        using namespace std;
        const int N=1e3+10;
        struct node{
        	int bg;
        	int ed;
        }a[N];
        int b[N],dp[N][N];
        int main(){
        	int n;cin>>n; 
        	for(int i=1;i<=n;i++){
        		cin>>b[i];
        		b[i+n]=b[i];
        	}
        	for(int i=1;i<2*n;i++){
        		a[i].bg=b[i],a[i].ed=b[i+1];
        	}
        	a[2*n].bg=b[2*n],a[2*n].ed=b[1];
        	for(int i=2*n-1;i>=1;i--){
        		for(int j=i+1;j<=2*n&&j-i+1<=n;j++){
        			for(int k=i;k<j;k++){
        				dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+a[i].bg*a[k].ed*a[j].ed);
        			}
        		}
        	}
        	int mx=0;
        	for(int i=1;i<=n;i++){
        		mx=max(mx,dp[i][i+n-1]);
        	}
        	cout<<mx<<endl;
        	return 0;
        } 
        
        • -1
          @ 2023-2-24 18:52:24

          又双叕是洛谷原题。这也是一道动规题因为标签是动规

          重点:

          • dp数组含义:dp[i][j]为以a[i]开头a[j]结尾的串释放出的最大总能量。
          • 状态转移方程为:dp[i][j]=max(dp[i][j],dp[j][k]+dp[k][j]+a[i]*a[k]*a[j])
          • 注意边界!这是一个环。所以要枚举起点
          • 遍历顺序:双重,一个枚举长度,一个枚举起点。
          • 然后就没有然后了...

          代码:

          #include <iostream>
          #include <cstring>
          #include <vector>
          #include <algorithm>
          using namespace std;
          
          int dp[401][401];
          int n,a[205]; 
          
          int main()
          {
              cin >> n;
              for(int i = 1;i <= n;i++)
              {
                  cin >> a[i];
                  a[n + i] = a[i];//因为这是一个环qwq
              } 
              for(int i = 2;i <= n + 1;i++) //长度 
              {
                  for(int j = 1;j + i - 1 <= 2 * n;j++) //起点 
                  {
                      int endx = j + i - 1; //终点 
                      for(int k = j + 1;k <= j + i - 2;k++) //分界线 
                      {
                      	dp[j][endx] = max(dp[j][endx],dp[j][k] + dp[k][endx] + a[j] * a[k] * a[endx]);
          			}
                  }
              }
              int maxn = -1e9;
              for (int i = 1;i <= n;i++) 
          	{
          		maxn = max(maxn,dp[i][n + i]);
          	}
              cout << maxn;
              return 0;
          }
          

          环形区间合并模板题,还是比较水的

          • 1

          信息

          ID
          230
          时间
          1000ms
          内存
          256MiB
          难度
          3
          标签
          递交数
          207
          已通过
          104
          上传者