样例输出122的解决方法
查看原帖
样例输出122的解决方法
1375417
return_liang楼主2025/2/4 03:20
#include <bits/stdc++.h>
using namespace std;

int a[35], dp[35][35], g[35][35];
void dfs(int i, int j){
	if(i > j) return;
	cout << g[i][j] << " ";
	dfs(i, g[i][j]-1);
	dfs(g[i][j]+1, j);
}
int main(){
	int n;
	cin >> n;
	for(int i=1;i <= n;i++){
		cin >> a[i];
	}
	for(int i=1;i <= n;i++){
		dp[i][i]=a[i];
		g[i][i]=i;
	}
	for(int len=2;len <= n;len++){
		for(int i=1;i <= n-len+1;i++){
			int j=i+len-1;
			for(int k=i;k <= j;k++){
				if(dp[i][k-1]*dp[k+1][j]+a[k] > dp[i][j]){
					dp[i][j]=dp[i][k-1]*dp[k+1][j]+a[k];
					g[i][j]=k;
				}
			}
		}
	}
	cout << dp[1][n] << "\n";
	dfs(1, n);
	return 0;
}

这段代码在输入样例时,会输出122 换行 4 2 1 3 5

这是因为在计算dp[1][2]=dp[1][0]*dp[2][2]+a[1](k=1k=1)时:dp[1][0]=0(不符合题意)

导致了dp[1][2]的计算错误,所以应该在初始化中加一行dp[i][i-1]=1

这样在计算空树的时候就不会错了。

2025/2/4 03:20
加载中...