【BZOJ1283】序列

Description

给出一个长度为 的正整数序列Ci,求一个子序列,使得原序列中任意长度为 的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和最大。

Input

第1行三个数N,m,k。 接下来N行,每行一个字符串表示Ci。

Output

最大和。

Sample Input

10 5 3
4 4 4 6 6 6 6 6 4 4

Sample Output

30

HINT

20%的数据:n<=10。
100%的数据:N<=1000,k,m<=100。Ci<=20000。

题解:很难想的费用流建图,看了题解才略懂,下面说一下建图方法和我的理解:

1.S->1...i -> i+1...n->T 容量k,费用0
2.i -> i+m 容量1,费用ai

我的理解是:假如你只有k个流量,要体现出所有的权值,你该如何利用这k个流量?显然你必须重复利用这些流量,就以[l,l+m]和[l+1,l+m+1],l的流量对l+m+1没有影响,所以l+m+1可以直接将l的流量拿过来用,达到节约流量的目的。这样一来,这k个流量在经过每个区间时都会选择权值最大的路径去走,这样跑最大费用流就能得出正确的解。

1283

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
int n,m,k,S,T,cnt,ans;
int to[30000],next[30000],head[1010],cost[30000],flow[30000],dis[1010],inq[1010],pe[1010],pv[1010];
queue<int> q;
void add(int a,int b,int c,int d)
{
to[cnt]=b,cost[cnt]=c,flow[cnt]=d,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,cost[cnt]=-c,flow[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
}
int bfs()
{
memset(dis,0x3f,sizeof(dis));
dis[S]=0,q.push(S);
int i,u;
while(!q.empty())
{
u=q.front(),q.pop(),inq[u]=0;
for(i=head[u];i!=-1;i=next[i])
{
if(dis[to[i]]>dis[u]+cost[i]&&flow[i])
{
dis[to[i]]=dis[u]+cost[i],pe[to[i]]=i,pv[to[i]]=u;
if(!inq[to[i]]) inq[to[i]]=1,q.push(to[i]);
}
}
}
return dis[T]<0x3f3f3f3f;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
int i,j,a;
S=0,T=n+1;
memset(head,-1,sizeof(head));
add(S,1,0,k);
for(i=1;i<=n;i++)
{
add(i,i+1,0,k);
scanf("%d",&a);
if(i+m<=n) add(i,i+m,-a,1);
else add(i,T,-a,1);
}
while(bfs())
{
int mf=1<<30;
for(i=T;i!=S;i=pv[i]) mf=min(mf,flow[pe[i]]);
ans-=dis[T]*mf;
for(i=T;i!=S;i=pv[i]) flow[pe[i]]-=mf,flow[pe[i]^1]+=mf;
}
printf("%d",ans);
return 0;
}

3550

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
int n,k,S,T,cnt,ans;
int to[30000],next[30000],head[1010],cost[30000],flow[30000],dis[1010],inq[1010],pe[1010],pv[1010];
queue<int> q;
void add(int a,int b,int c,int d)
{
to[cnt]=b,cost[cnt]=c,flow[cnt]=d,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,cost[cnt]=-c,flow[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
}
int bfs()
{
memset(dis,0x3f,sizeof(dis));
dis[S]=0,q.push(S);
int i,u;
while(!q.empty())
{
u=q.front(),q.pop(),inq[u]=0;
for(i=head[u];i!=-1;i=next[i])
{
if(dis[to[i]]>dis[u]+cost[i]&&flow[i])
{
dis[to[i]]=dis[u]+cost[i],pe[to[i]]=i,pv[to[i]]=u;
if(!inq[to[i]]) inq[to[i]]=1,q.push(to[i]);
}
}
}
return dis[T]<0x3f3f3f3f;
}
int main()
{
scanf("%d%d",&n,&k);
int i,j,a;
S=0,T=3*n+1;
memset(head,-1,sizeof(head));
add(S,1,0,k);
for(i=1;i<=3*n;i++)
{
add(i,i+1,0,k);
scanf("%d",&a);
if(i+n<=3*n) add(i,i+n,-a,1);
else add(i,T,-a,1);
}
while(bfs())
{
int mf=1<<30;
for(i=T;i!=S;i=pv[i]) mf=min(mf,flow[pe[i]]);
ans-=dis[T]*mf;
for(i=T;i!=S;i=pv[i]) flow[pe[i]]-=mf,flow[pe[i]^1]+=mf;
}
printf("%d",ans);
return 0;
}

【BZOJ1283/3550】序列/[ONTAK2010]Vacation 最大费用流的更多相关文章

  1. [bzoj4842][bzoj1283][Neerc2016]Delight for a Cat/序列_线性规划_费用流

    4842: [Neerc2016]Delight for a Cat_1283: 序列 题目大意:ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜 ...

  2. BZOJ1283 序列(费用流)

    不妨看做是先用k个指针指向被选择的前k个元素,然后每次将选中当前第一个元素的指针移到最后,并且需要满足位置变化量>=m.显然这样可以构造出所有的合法方案.那么可以以此建立费用流模型,以一条流量k ...

  3. 【bzoj1283】序列 线性规划与费用流

    题目描述 给出一个长度为 的正整数序列Ci,求一个子序列,使得原序列中任意长度为 的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和最大. 输入 第1行三个数N,m,k. ...

  4. BZOJ_3550_[ONTAK2010]Vacation&&BZOJ_1283:_序列_网络流解线性规划

    BZOJ_3550_[ONTAK2010]Vacation&&BZOJ_1283:_序列_网络流解线性规划 Description 给出一个长度为 的正整数序列Ci,求一个子序列,使得 ...

  5. [NOI2019]序列(模拟费用流)

    题意: 有两个长度为n的序列,要求从每个序列中选k个,并且满足至少有l个位置都被选,问总和最大是多少. \(1\leq l\leq k\leq n\leq 2*10^5\). 首先,记录当前考虑到的位 ...

  6. luogu P5470 [NOI2019]序列 dp 贪心 费用流 模拟费用流

    LINK:序列 考虑前20分 容易想到爆搜. 考虑dp 容易设\(f_{i,j,k,l}\)表示前i个位置 选了j对 且此时A选择了k个 B选择了l个的最大值.期望得分28. code //#incl ...

  7. P5470-[NOI2019]序列【模拟费用流】

    正题 题目链接:https://www.luogu.com.cn/problem/P5470 题目大意 两个长度为\(n\)的序列\(a,b\),求出它们两个长度为\(K\)的子序列,且这两个子序列至 ...

  8. BZOJ 3550: [ONTAK2010]Vacation [单纯形法]

    有3N个数,你需要选出一些数,首先保证任意长度为N的区间中选出的数的个数<=K个,其次要保证选出的数的个数最大. 好像都是费用流... 单纯性裸题呀... 注意每个数最多选1次 #include ...

  9. BZOJ 1283: 序列 (最大费用流)

    题意 有n个正整数,要选取里面的一些数,在保证每m个连续的数中最多选k个的情况下,使得得到的值最大. 分析 我们可以把问题先转化为选k次,每一次每m个数只能选一个.那么根据贪心的策略,每m个里一定会选 ...

随机推荐

  1. Struts2中防止表单重复提交,global-results定义全局结果处理

    1.在表单中加入<s:token/>标签 2.在动作类中加入token的拦截器 <!--如果单单写 name="token" 会丧失 defaultStack 拦 ...

  2. 解决 TextMate 2 无法安装 Emmet 插件

    本篇文章由:http://xinpure.com/solving-textmate-2-cannot-install-emmet-plugin/ 前端神器 Emmet 插件原名为 ZedCoding ...

  3. 系统流畅/性能受限 谷歌Nexus4详细评测

    http://mobile.it168.com/a2012/1220/1437/000001437938_8.shtml

  4. JS 毫秒日期相互转换 JS获取 今天 明天 昨天的日期

    var dd = new Date(); var AddDayCount = 0; //0 今天 1 明天 -1 昨天 以此类推 dd.setDate(dd.getDate() + AddDayCou ...

  5. chrome-bug

    1.web前端的问题,为什么chrome浏览器下,input type=text 输入框的提示信息隐藏 是因为chrome谷歌浏览器input属性他默认的有...可能你需要把input设置一下disp ...

  6. php 验证访问浏览器是电脑还是手机

    //判断如果为手机用户则 if(checkmobile()==true) { $url=$_SERVER["HTTP_HOST"]; $urlHost=GetHost($url); ...

  7. freeswitch 音 视频 支持的编码

    FreeSWITCH 支持很多的语音编解码:[13] PCMU – G.711 µ-law PCMA – G.711 A-law G.722 G.722.1 G.722.1c G.726 G.726  ...

  8. Atitit.遍历图像像素点rgb java attilax总结

    Atitit.遍历图像像素点rgb java attilax总结 1. 遍历像素点 1 2. 提取一行 1 3. Rgb分量提取 2 4. 其他读取像素 3 5. --code 5 6. 参考 6 1 ...

  9. Atitit.swt 线程调用ui控件的方法

    Atitit.swt 线程调用ui控件的方法 1 SwingUtilities.invokeLater1 2 display.asyncExec方法1 3  display.timerExec(500 ...

  10. Vivado Logic Analyzer的使用(二)

    本文基于Vivado 2014.2,阅读前请参考前文http://blog.chinaaet.com/detail/37264 之前的设计都是出发后直接捕获数据.其实,与chipscope类似,可以设 ...