标签:return 证明 lan max bit 为什么 space std efi
这是一个区间DP。
本题有一个一开始令我疑惑的点:为什么在第23行,这种解法只考虑了左子树为空的情况?后来想了想,觉得可能有两个原因。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[40],d[40][40],n,root[40][40];
void print(ll l,ll 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];
d[i][i] = a[i];
root[i][i] = i;
}
ll maxn = 0;
for(int l = 2; l <= n; l++)
for(int i = 1; i + l - 1 <= n; i++){
int j = i + l - 1;
d[i][j] = d[i + 1][j] + d[i][i]; //假如左子树为空
root[i][j] = i;
for(int k = i + 1 ; k < j; k++){ //枚举左右子树的中间断点
if(d[i][j] < d[i][k - 1] * d[k + 1][j] + d[k][k]){
d[i][j] = d[i][k - 1] * d[k + 1][j] + d[k][k];
maxn = max(maxn,d[i][j]);
root[i][j] = k; //记录根节点,用于输出方案
}
}
}
cout << maxn << endl;
print(1,n);
return 0;
}
标签:return 证明 lan max bit 为什么 space std efi
原文地址:https://www.cnblogs.com/FoxC/p/13205007.html