PKUACM 2018 A: Wife (C18A) 差分约束/DP

$ \rightarrow $ 戳我进PKU原题

  • 在 $ N $ 天内,第 $ i $ 天每陪妹子 $ 1 $ 小时就要付出 $ c_i $ 的代价(陪了妹子就不能刷题了)

  • 每连续的 $ 7 $ 天里至少陪妹子 $ 7 $ 个小时 (不然妹子就跑了)

  • 求出至少需要付出多少代价,$ N \le 10000 $


  • 这是一个线性规划问题

  • 设第 $ i $ 天陪 $ x_i $ 小时

  • 目标函数 $ min \sum_{i=1}^{N}c_i x_i $

  • 约束条件 $ x_i \ge 0 , x_i + x_{i+1} + ...... x_{i+6} \ge 7 $

  • 用矩阵形式表示

\[ X= \begin{bmatrix} x_1\\x_2\\ \vdots \\x_N\end{bmatrix} , C= \begin{bmatrix} c_1\\c_2\\ \vdots \\c_N\end{bmatrix} , B=\begin{bmatrix} 7\\7\\ \vdots \\7\end{bmatrix} ,A=\begin{bmatrix} 1&1&1&1&1&1&1&0&0& \cdots &0\\0&1&1&1&1&1&1&1&0& \cdots &0\\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \ddots & \vdots \\0&0&0&0&0&0&0&0&0& \vdots &1\end{bmatrix} \]

 

  • 线性规划标准型

  • 目标函数 $ min C^T X$

  • 约束条件 $ X \ge 0 , AX \ge B $

 

  • 线性规划对偶型

  • 目标函数 $ max Y^T B $ (根据对偶定理,与原目标函数最优解相等)

  • 约束条件 $ Y \ge 0 , Y^T A \le C^T $

  • 这是一个差分约束系统

  • 设 $ s_i = \sum_{j=1}^{i} Y_i $ ,目标 $ max7s_N $

  • 约束条件:

  • $ s_i - s_{i-1} \ge 0 $

  • $ s_i - s_0 \le c_i (i < 7) , s_i - s_{i-7} \le c_i (7 \le N-7) , s_N - s_{i-1} \le (i > N-7) $

然而我并没有写出来,之后再填坑吧


  • 更快的方法是动态规划

  • 结论:每天要么陪 $ 7 $ 小时,要么不陪

 

  • $ F[i] $ 表示前 $ i $ 天,其中第 $ i $ 天必须陪,满足题目要求的最小代价

  • $ F[0]=0 $

  • $ F[i]=min_{i-7 \le j < i} {F[j]} +7c_i $

  • 目标: $ min_{N-6 \le i \le N} { F[i] } $

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int t,n,c,f[10005],ans;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        memset(f,0x3f,sizeof(int)*(n+1));
        f[0]=0; ans=1e9+7;
        for(int i=1;i<=n;++i){
            scanf("%d",&c);
            for(int j=max(i-7,0);j<i;++j) 
                f[i]=min(f[i],f[j]+7*c);
        }
        for(int i=max(n-6,0);i<=n;++i) ans=min(ans,f[i]);
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/PotremZ/p/9429324.html