杭二中白馬湖p1648郵局加強版

2021-08-19 22:13:13 字數 1096 閱讀 3427

int s[n][n]; // 決策點

ll w[n][n], f[n][n];

ll s[n];

int a[n];

int n, m;

// f[i][j] 表示前 i 個村莊建 j 個郵局最小花費

// w[i][j] 表示第 i 個村莊和第 j 個村莊間建 1 個郵局的最少花費

// s[i][j] 表示前 i 個村莊建 j 個郵局最小花費與建 j - 1 個郵局的決策點

// a <= b <= c <= d

// w[a][b] + w[c][d] <= w[a][d] + w[b][c] 滿足四邊形不等式, 即滿足決策點 s 單調

// 區間單調 : a <= b <= c <= d

// s[b][c] <= s[a][d]

// s[i][j - 1] <= s[i][j] <= s[i + 1][j]

int main()

for(int i = 1; i <= n; i++) scanf("%d", &a[i]);

sort(a + 1, a + n + 1);

for(int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i];

for(int i = 1; i <= n; i++)

}for(int i = 1; i <= n; i++) s[i][1] = 1;

for(int i = 1; i <= n; i++) f[i][1] = w[1][i];

for(int j = 2; j <= m; j++) }}

}printf("%lld", f[n][m]);

return

0;}