2 条题解

  • 0
    @ 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;
    }
    
    • 0
      @ 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);
        
        
      
      }
      
      • 1

      信息

      ID
      475
      时间
      1000ms
      内存
      512MiB
      难度
      3
      标签
      递交数
      39
      已通过
      24
      上传者