CF321E Ciel and Gondolas
题解
本来想练WQS的
结果还是只会分治
#include<bits/stdc++.h> using namespace std; inline int read() { int f = 1,x = 0; char ch; do { ch = getchar(); if(ch == '-') f = -1; }while(ch < '0' || ch > '9'); do { x = (x<<3) + (x<<1) + ch - '0'; ch = getchar(); }while(ch >= '0' && ch <= '9'); return f*x; } const int MAXN = 4000 + 10; const int MAXK = 800 + 10; #define ll long long #define re register int n,k; int a[MAXN][MAXN],sum[MAXN][MAXN]; ll dp[MAXK][MAXN]; inline ll calc(int l,int r) { return sum[r][r] - sum[r][l-1] -sum[l-1][r] + sum[l-1][l-1]; } inline void solve(int x,int L,int R,int l,int r) { if(L>R||l>r) return; int mid = (l+r)>>1,d = 0; for(int i=L;i<=R&&i<mid;i++) { ll res = calc(i+1,mid); if(dp[x][mid] > dp[x-1][i] + res) { dp[x][mid] = dp[x-1][i] + res; d = i; } } solve(x,L,d,l,mid-1);solve(x,d,R,mid+1,r); } int main() { n = read(),k = read(); for(re int i=1;i<=n;i++) for(re int j=1;j<=n;j++) a[i][j] = read(),sum[i][j] = sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+a[i][j]; memset(dp,127,sizeof(dp));dp[0][0] = 0; for(int i=1;i<=k;i++) solve(i,0,n,1,n); printf("%lld ",dp[k][n]/2); }