题解:P11676 [USACO25JAN] DFS Order P
reinforest · · 题解
加深了对树形区间 dp 的理解。
设
然后考虑转移,现在合并区间
这样有一种转移
但是这个转移是不对的,需要考虑
重新考虑状态,设
这个时候转移只需要多一步,在按照以上的式子转移好后,对于
时间复杂度
#include<bits/stdc++.h>
#define ll long long
using namespace std;
constexpr ll N=755;
ll n,a[N][N],dp[N][N],sum[N][N];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
memset(dp,0x3f,sizeof(dp));
for(int j=2;j<=n;j++){
for(int i=1;i<j;i++){
cin>>a[i][j];
//a[j][i]=a[i][j];
}
}
for(int i=1;i<=n;i++){
a[i][i]=0;
for(int j=n;j>i;j--){
sum[i][j]=sum[i][j+1]+max(0ll,-a[i][j]);
}
}
for(int i=n;i>=1;i--){
dp[i][i]=0;
for(int j=i+1;j<=n;j++){
for(int k=i;k<=j;k++){
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+max(0ll,a[i][k+1]));
}
}
for(int j=i;j<=n;j++){
dp[i][j]+=sum[i][j+1];
}
}
cout<<dp[1][n]<<"\n";
return 0;
}