博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】4873: [Shoi2017]寿司餐厅
阅读量:6915 次
发布时间:2019-06-27

本文共 1391 字,大约阅读时间需要 4 分钟。

【题目】

【题意】给定n种寿司的代号,取区间[i,j]的寿司收益是d[i,j]和所有子区间的d,吃了c(c>0)种代号x的寿司的代价是mx^2+cx,给定n,m和矩阵d(有负数!),求最大收益。n<=100。

【算法】最大权闭合子图

【题解】开始考虑每个区间建一个收益点向区间内的寿司连边,然后对每个代号新建一个点权为-mx^2的点,每种寿司寿司连向代号点,这样就是求最大权闭合子图了。

但是这样边数是n^3,可能过不了。

考虑优化,区间$[i,j]$只需要连向$[i,j-1]$和$[i+1,j]$就可以了,所有区间$[i,i]$的点权为d[i,i]-a[i],这样边数只有n^2,复杂度O(n^4)。

#include
#include
#include
using namespace std;const int inf=0x3f3f3f3f;int n,m,S,T,a[110];namespace nwf{ const int maxn=20010,maxm=40010; int tot=1,first[maxn],d[maxn],q[maxn],cur[maxn]; struct edge{
int v,f,from;}e[maxm*2]; void insert(int u,int v,int f){ tot++;e[tot].v=v;e[tot].f=f;e[tot].from=first[u];first[u]=tot; tot++;e[tot].v=u;e[tot].f=0;e[tot].from=first[v];first[v]=tot; } bool bfs(){ memset(d,-1,sizeof(d)); d[S]=0; int head=0,tail=1;q[head]=S; while(head
0)nwf::insert(S,(i-1)*n+j,u),ans+=u;else nwf::insert((i-1)*n+j,T,-u);// } else if(u-a[i]>0)nwf::insert(S,(i-1)*n+j,u-a[i]),ans+=u-a[i];else nwf::insert((i-1)*n+j,T,a[i]-u); } } for(int i=1;i<=1000;i++){ nwf::insert(n*n+i,T,i*i*m); for(int j=1;j<=n;j++)if(a[j]==i)nwf::insert((j-1)*n+j,n*n+i,inf); } printf("%d",ans-nwf::dinic()); return 0;}
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/8733405.html

你可能感兴趣的文章
单词纠错
查看>>
你可能不知道的14个JavaScript调试技巧
查看>>
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG
查看>>
根据背景颜色的亮度调整字体的颜色
查看>>
python requests socks代理
查看>>
PHP socket初探 --- 含着泪也要磕完libevent(三)
查看>>
白鹭引擎王泽:重度H5游戏性能优化技巧
查看>>
PHP编译参数configure配置详解(持续更新中)
查看>>
ios 服务器端php推送证书生成
查看>>
多列布局(column)
查看>>
用Python写算法 | 蓄水池算法实现随机抽样
查看>>
canvas核心技术-如何绘制线段
查看>>
数组去重方法总结
查看>>
React 事件系统
查看>>
Android Architecture Components Part4:ViewModel
查看>>
weex开发问题记录
查看>>
【跃迁之路】【484天】程序员高效学习方法论探索系列(实验阶段241-2018.06.04)...
查看>>
站在巨人肩膀上看源码-LinkedList
查看>>
Jquery 以及AngularJS 中 Get/Post 传参笔记
查看>>
Android入门篇(二)布局文件 容器②
查看>>