bzoj1283 序列 線性規劃與費用流

2022-05-20 11:02:28 字數 1391 閱讀 6139

題目描述

給出乙個長度為 的正整數序列ci,求乙個子串行,使得原序列中任意長度為 的子串中被選出的元素不超過k(k,m<=100) 個,並且選出的元素之和最大。

輸入第1行三個數n,m,k。 接下來n行,每行乙個字串表示ci。

輸出最大和。

樣例輸入

10 5 3

4 4 4 6 6 6 6 6 4 4

樣例輸出

30題解

線性規劃與費用流

關於線性規劃與費用流的具體講解參見 bzoj1061 。

這道題和那道差不多,都是給出一大堆限制條件,每個變數在限制條件中的出現是連續的。

所以我們可以按照那道題的思路來做。

原始限制條件是$\begin0\le x_i\le1\\x_1+x_2+...+x_m\le k\\x_2+x_3+...+x_\le k\\...\\x_+x_+...+x_n\le k\end$,

轉化為相等關係為$\begin0\le x_i\le1\\y_i\ge0\\x_1+x_2+...+x_m+y_1=k\\x_2+x_3+...+x_+y_2=k\\...\\x_+x_+...+x_n+y_=k\end$,

新增恒等關係0=0,上下差分並移項得$\beginx_1+x_2+...+x_m+y_1-k=0\\x_-x_1+y_2-y_1=0\\x_-x_2+y_3-y_2=0\\...\\x_-x_+y_-y_=0\\x_n-x_+y_-y_=0\\-x_-x_-...-x_n-y_+k=0\end$。

根據這個建圖,將這n-m+2個限制條件看作點,那麼s->1,容量為k,費用為0;n-m+2->t,容量為k,費用為0;i->i+1,容量為inf,費用為0;對於每個變數xi,判斷它係數為+1的位置和係數為-1的位置,+1向-1連邊。容量為1,費用為ci。

然後跑最大費用最大流出解,具體地,將費用取相反數,跑最小費用最大流,再反過來即可。

#include #include #include #define n 1500

#define m 30000

#define inf 0x3f3f3f3f

using namespace std;

queueq;

int head[n] , to[m] , val[m] , cost[m] , next[m] , cnt = 1 , s , t , dis[n] , from[n] , pre[n];

void add(int x , int y , int v , int c)

bool spfa()

return ~from[t];

}int mincost()

return ans;

}int main()

printf("%d\n" , -mincost());

return 0;

}

bzoj 1283 線性規劃

time limit 10 sec memory limit 162 mb submit 200 solved 114 submit status discuss 給出乙個長度為 的正整數序列ci,求乙個子串行,使得原序列中任意長度為 的子串中被選出的元素不超過k k,m 100 個,並且選出的元素...

BZOJ 1283 序列 費用流

題目大意 給定乙個長度為n的序列,要求選一些數,使得任意乙個長度為m個區間中最多選k個數,求最大的和 費用流直接跑就是了 把這個序列用流量為k費用為0的邊連成一條直線 然後第i個點向第i m個點連一條費用為a i 流量為1的邊 跑最大費用最大流即可 卡單純型差評。include include in...

bzoj1283 序列 費用流

一開始想了乙個錯誤的建圖,後來看了題解才發現建圖這麼巧妙,用流量為k,費用為0的邊將序列穿起來,然後每個點i向點i m連一條流量為1,費用為a i 的邊,結果費用流寫呲了,調了一會。include include include include include include define maxn...