->题目链接

题解:

网络流。

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#define N 4010
#define inf 1000000000
using namespace std;
int a[N][N],head[N],dis[N],inq[N],fa[N],n,m,num,cnt,S,T;
struct node {
int u,v,pre,f,w;
} e[N];
void add(int u,int v,int f,int w) {
e[++cnt].u=u;e[cnt].v=v;
e[cnt].f=f;e[cnt].w=w;
e[cnt].pre=head[u];head[u]=cnt;
e[++cnt].u=v;e[cnt].v=u;
e[cnt].f=;e[cnt].w=-w;
e[cnt].pre=head[v];head[v]=cnt;
}
bool spfa() {
for(int i=; i<=T; i++) dis[i]=inf;
queue<int> q;
q.push(S);
inq[S]=;
dis[S]=;
while(!q.empty()) {
int u=q.front();
q.pop();
inq[u]=;
for(int i=head[u]; i; i=e[i].pre)
if(e[i].f&&dis[e[i].v]>dis[u]+e[i].w) {
dis[e[i].v]=dis[u]+e[i].w;
fa[e[i].v]=i;
if(!inq[e[i].v]) {
inq[e[i].v]=;
q.push(e[i].v);
}
}
}
return dis[T]!=inf;
}
void mincost() {
int cost=;
while(spfa()) {
int tmp=fa[T],x=inf;
while(tmp) {
int u=e[tmp].u;
x=min(x,e[tmp].f);
tmp=fa[e[tmp].u];
}
tmp=fa[T];
while(tmp) {
e[tmp].f-=x;
e[tmp^].f+=x;
tmp=fa[e[tmp].u];
}
cost+=x*dis[T];
}
printf("%d\n",-cost);
}
int hao(int i,int j) {
return (m*+i-)*(i-)/+j;
}
void build1() {
cnt=;
memset(head,,sizeof(head));
for(int i=; i<=m; i++)
add(S,i,,-a[][i]);
for(int i=; i<n; i++)
for(int j=; j<=m+i-; j++)
add(hao(i,j)+num,hao(i+,j),,-a[i+][j]),add(hao(i,j)+num,hao(i+,j+),,-a[i+][j+]);
for(int i=; i<=m+n-; i++)
add(hao(n,i)+num,T,,);
for(int i=; i<=n; i++)
for(int j=; j<=m+i-; j++)
add(hao(i,j),hao(i,j)+num,,); }
void build2() {
cnt=;
memset(head,,sizeof(head));
for(int i=; i<=m; i++)
add(S,i,,-a[][i]);
for(int i=; i<=n; i++)
for(int j=; j<=m+i-; j++)
add(hao(i,j),hao(i+,j),,-a[i+][j]),add(hao(i,j),hao(i+,j+),,-a[i+][j+]);
for(int i=; i<=m+n-; i++)
add(hao(n,i),T,inf,);
}
void build3() {
cnt=;
memset(head,,sizeof(head));
for(int i=; i<=m; i++)
add(S,i,,-a[][i]);
for(int i=; i<=n; i++)
for(int j=; j<=m+i-; j++)
add(hao(i,j),hao(i+,j),inf,-a[i+][j]),add(hao(i,j),hao(i+,j+),inf,-a[i+][j+]);
for(int i=; i<=m+n-; i++)
add(hao(n,i),T,inf,);
}
int main() {
scanf("%d%d",&m,&n);
num=(m*+n-)*n/;
S=;
T=num*+;
for(int i=; i<=n; i++)
for(int j=; j<=m+i-; j++)
scanf("%d",&a[i][j]);
build1();
mincost();
build2();
mincost();
build3();
mincost();
return ;
}

AC

我走我的独木桥。

最新文章

  1. OS X El Capitan的 U 盘制作过程
  2. JS-reverse(数组内容颠倒)
  3. centos 7.0安装花生壳
  4. angularJs内置指令63个
  5. 转:Busy Developers&#39; Guide to HSSF and XSSF Features
  6. 一个简单的获取参数的jqure
  7. jQuery系列 第五章 jQuery框架动画特效
  8. 调试ucosii_pendsv中断函数有感
  9. Kafka作为大数据的核心技术,你了解多少?
  10. mycat环境搭建
  11. List&lt;Map&lt;String, Object&gt;&gt;集合中获取某个key并转换为List&lt;Integer&gt;集合
  12. 19-04【mysql】transaction,autocommit
  13. SELECT INTO和INSERT INTO SELECT的区别
  14. es6 箭头函数【箭头表达式】
  15. Jenkins构建自动化任务
  16. css对于文字过长加省略号
  17. MyBatis insert操作返回主键
  18. 我的IT未来
  19. luogu1081 [NOIp2012]开车旅行 (STL::multiset+倍增)
  20. 简单的卷积神经网络(CNN)的搭建

热门文章

  1. Webservice银行报文接口设计
  2. 洛谷——P2957 [USACO09OCT]谷仓里的回声Barn Echoes
  3. java——简单理解线程
  4. 如何修复和检测Windows系统漏洞
  5. Fedora 13 Alpha测试手记横空出世
  6. 一个小的考试系统 android 思路
  7. 解决vmware 和hyper-v不能共存的问题
  8. geotools修改shapefile 属性名乱码问题
  9. 对象的序列化与反序列化---IO学习笔记(四)
  10. C# 依据KeyEventArgs与组合键字符串相互转换