2 条题解

  • -1
    @ 2023-6-10 9:57:09
    #include<bits/stdc++.h>
    using namespace std;
    const int N=35;
    int f[N][N];
    int s[N][N];
    int w[N];
    int n;
    void dfs(int l,int r)
    {
        if(l>r) return;
        cout<<s[l][r]<<" ";
        dfs(l,s[l][r]-1);
        dfs(s[l][r]+1,r);
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>w[i];
        for(int len=1;len<=n;len++)
        for(int i=1;i+len-1<=n;i++){
            int j=i+len-1;
            if(len==1) f[i][j]=w[i],s[i][j]=i;
            else{
                for(int k=i;k<=j;k++)
                {
                    int left = k== i ? 1 : f[i][k-1];
                    int right=k==j ? 1: f[k+1][j];
                    int score=left*right+w[k];
                    if(score>f[i][j]) f[i][j]=score,s[i][j]=k;            }
            }
        }
        cout<<f[1][n]<<endl;
        dfs(1,n);
      
      
    
    }
    
    • -2
      @ 2023-7-15 10:25:46
      #include 
      using namespace std;
      const int N = 35;
      int n;
      int h[N], ne[N], to[N], id;
      int dp[N][N], root[N][N];
      int a[N];
      
      int dfs(int l, int r)
      {
      	if(l == r)
      	{
      		root[l][r] = l;
      		return a[l];
      	}
      	else if(dp[l][r]) return dp[l][r];
      	else
      	{
      		if(dfs(l + 1, r) + a[l] > dp[l][r])
      		{
      			dp[l][r] = dfs(l + 1, r) + a[l];
      			root[l][r] = l;
      		}
      		if(dfs(l, r - 1) + a[r] > dp[l][r])
      		{
      			dp[l][r] = dfs(l, r - 1) + a[r];
      			root[l][r] = r;
      		}
      		for(int i = l + 1; i < r; i++)
      		{
      			if(dfs(l, i - 1) * dfs(i + 1, r) + a[i] > dp[l][r])
      			{
      				dp[l][r] = dfs(l, i - 1) * dfs(i + 1, r) + a[i];
      				root[l][r] = i;
      			}
      		}
      	}
      	return dp[l][r];
      }
      
      void print(int l, int r)
      {
      	if(l > r) return;
      	cout << root[l][r] << ' ';
      	if(l == r) return;
      	print(l, root[l][r] - 1);
      	print(root[l][r] + 1, r);
      }
      
      int main()
      {
      	cin >> n;
      	for(int i = 1; i <= n; i++)	cin >> a[i];
      	cout << dfs(1, n) << endl;
      	print(1, n);
      	return 0;
      }
      
      • 1

      信息

      ID
      475
      时间
      1000ms
      内存
      512MiB
      难度
      2
      标签
      递交数
      58
      已通过
      38
      上传者