Flight Boarding Optimization

来源:互联网 发布:windows 虚拟机下载 编辑:程序博客网 时间:2024/06/05 10:01

Gym - 100269F
这里写图片描述

暴力dp,f[i][k]表示前 i 个座位分了 k 次,总和最小是多少,可以从 f[j][k-1]转移过来,只需要预处理出 [j,i-1] 对 [i,s] 的影响就好了,用前缀和挺容易维护的。

#include <bits/stdc++.h>using namespace std;const int maxn = 1010;const int maxx = maxn*maxn*10;int f[maxn][maxn], a[maxn], ans, n, s, kk, g[maxn][maxn], sum[maxn][maxn];int main() {    freopen("flight.in","r",stdin);    freopen("flight.out","w",stdout);    scanf("%d %d %d", &n, &s, &kk);    kk--;    for (int i = 1; i <= n; i++) {        scanf("%d", &a[i]);        for (int j = 1; j < i; j++) if (a[j] < a[i]) g[a[j]][a[i]]++;    }    for (int i = 1; i <= s; i++)         for (int j = 1; j <= s; j++) {            sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+g[i][j];        }    for (int i = 1; i <= s; i++)        for (int j = 0; j <= kk; j++) f[i][j] = maxx;    ans = sum[s][s];    f[1][0] = sum[s][s];    for (int i = 2; i <= s; i++)        for (int j = 1; j < i; j++)            for (int k = 0; k < j && k < kk; k++) {                f[i][k+1] = min(f[i][k+1], f[j][k]-(sum[i-1][s]-sum[j-1][s]-sum[i-1][i-1]+sum[j-1][i-1]));                ans = min(ans, f[i][k+1]);            }    printf("%d\n", ans);}
原创粉丝点击