?
# | Author | Problem | Lang | Verdict | Time | Memory | Sent | Judged | |
---|---|---|---|---|---|---|---|---|---|
187501711 |
Practice: DaiRuiChen007 |
1666J - 23 | C++14 (GCC 6-32) | Accepted | 62 ms | 1276 KB | 2023-01-01 10:47:51 | 2023-01-01 10:47:51 |
// LUOGU_RID: 98429027 #include<bits/stdc++.h> #define int long long using namespace std; const int MAXN=201,INF=1e17; int dp[MAXN][MAXN],rt[MAXN][MAXN],c[MAXN][MAXN],sum[MAXN][MAXN],fa[MAXN]; inline void dfs(int l,int r,int f) { if(l>r) return ; int k=rt[l][r]; fa[k]=f; dfs(l,k-1,k),dfs(k+1,r,k); } inline int cnt(int r1,int r2,int c1,int c2) { if(r1>r2||c1>c2) return 0; return sum[r2][c2]-sum[r2][c1-1]-sum[r1-1][c2]+sum[r1-1][c1-1]; } signed main() { int n; scanf("%lld",&n); for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { scanf("%lld",&c[i][j]); sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+c[i][j]; } } for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) dp[i][j]=INF; for(int i=1;i<=n;++i) dp[i][i]=0,rt[i][i]=i; for(int len=1;len<n;++len) { for(int l=1,r=l+len;r<=n;++l,++r) { for(int k=l;k<=r;++k) { int val=cnt(l,k-1,1,l-1)+cnt(l,k-1,k,n)+cnt(k+1,r,1,k)+cnt(k+1,r,r+1,n)+(k==l?0:dp[l][k-1])+(k==r?0:dp[k+1][r]); if(val<dp[l][r]) rt[l][r]=k,dp[l][r]=val; } } } dfs(1,n,0); for(int i=1;i<=n;++i) printf("%lld ",fa[i]); puts(""); return 0; }
?
?
?
?