洛谷:P1040 加分二叉树(dp,普及+/提高)

题目:

在这里插入图片描述

分析:被二叉树,X序遍历吓着了。

在这里插入图片描述

代码:傻了,写成了先序

#include<bits/stdc++.h>
using namespace std;
int n;
int A[40];
int D[40][40];
int f(int x,int y)//以x为根,到y 
{
 if(x==y) return A[x];
 if(x+1==y) return A[x]+A[y];
 for(int i=x;i<y;i++)
 {
  D[x][y]=max(D[x][y],A[x]+f(x,i)*f(i+1,y));
 }
 return D[x][y];
}
int main()
{
 cin>>n;
 for(int i=0;i<n;i++)
 {
  cin>>A[i];
 }
 memset(D,-1,sizeof(D));
 cout<<f(0,n-1); 
}

妈耶,输出把自己想迷糊了,放弃输出顺序了。

#include<bits/stdc++.h>
using namespace std;
int n;
int A[40];
int D[40][40];
int f(int x,int y)//以x为根,到y 
{
 if(x>y) return 1; 
 if(x==y) return A[x];
 if(x+1==y) return A[x]+A[y];
 int cc;
 for(int i=x;i<=y;i++)
 {
  if(A[i]+f(x,i-1)*f(i+1,y)>D[x][y]) cc=i; 
  D[x][y]=max(D[x][y],A[i]+f(x,i-1)*f(i+1,y));
 }
 return D[x][y];
}
int main()
{
 cin>>n;
 for(int i=0;i<n;i++)
 {
  cin>>A[i];
 }
 memset(D,-1,sizeof(D));
 cout<<f(0,n-1); 
}

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/107612708