求解惑,虽然ac了
查看原帖
求解惑,虽然ac了
1066579
XP3301_Pipi楼主2023/10/12 20:41

用的区间dp,每次初始化区间最大积分的时候只考虑了根为左端点(也就是右子树为空)的情况,右端点为根没有考虑,循环里也不会考虑这种情况,为啥还AC了。。。

#include<bits/stdc++.h>
using namespace std;
long long a[35],dp[35][35],n,root[35][35];
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];
	for(int i=1;i<=n;i++) dp[i][i]=a[i],root[i][i]=i;
	for(int len=2;len<=n;len++){
		for(int i=1;i+len-1<=n;i++){
			int j=i+len-1;
			dp[i][j]=dp[i][i]+dp[i+1][j];
			root[i][j]=i;
			for(int r=i+1;r<j;r++){
				if(dp[i][r-1]*dp[r+1][j]+dp[r][r]>dp[i][j]){
					dp[i][j]=dp[i][r-1]*dp[r+1][j]+dp[r][r];
					root[i][j]=r;
				} 
			}
		}
	}
	cout<<dp[1][n]<<endl;
	print(1,n);
	return 0;
} 
2023/10/12 20:41
加载中...