社区讨论

为何将右端点j从i+len-1改为i+len即可AC

P1040[NOIP 2003 提高组] 加分二叉树参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhjask4c
此快照首次捕获于
2025/11/03 23:31
4 个月前
此快照最后确认于
2025/11/03 23:31
4 个月前
查看原帖
Code:
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=35;
int n;
int dp[N][N],root[N][N];
void dfs(int l,int r){
    if (l>r)return;
    int mid=(l+r)>>1;
    cout<<root[l][r]<<" ";
    if (l==r)return;
    dfs(l,root[l][r]-1);
    dfs(root[l][r]+1,r);
}
int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n;
    for (int i=1;i<=n;i++)cin>>dp[i][i],root[i][i]=i,dp[i][i-1]=1;
    for (int len=1;len<n;len++){
        for (int i=1;i+len<=n;i++){
            int j=i+len;
            root[i][j]=i;
            //需要初始化f[i][j]
            dp[i][j]=dp[i+1][j]*1+dp[i][i];
            for (int k=i+1;k<j;k++){
                if (dp[i][k-1]*dp[k+1][j]+dp[k][k]>dp[i][j]){
                    dp[i][j]=dp[i][k-1]*dp[k+1][j]+dp[k][k];
                    root[i][j]=k;
                }
            }
        }
    }
    cout<<dp[1][n]<<"\n";
    dfs(1,n);
    return 0;
}
一个区间不应该是从 iii+len1i+len-1 吗,我的代码为何改成 i+leni+len 就能 AC ?

回复

4 条回复,欢迎继续交流。

正在加载回复...