思路:

dp方法:

    设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值。

    则转移方程为

    dp[i][j][k][l]=max(dp[i-1][j][k-1][l],dp[i][j-1][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k][l-1])+map[i][j]+map[k][l];

    若两点相同减去一个map[i][j]即可

费用流方法(可以扩展为k条路径,但时间复杂度较高):

    源点连接左上角点流量为k、费用为0,右下角点连接汇点流量为k、费用为0,所有点连接右边相邻和下边相邻点流量为k、费用为0,所有点拆点一条流量为1、费用为该

    点价值,一条流量为k-1、费用为0。跑最大费用流即可

代码:

dp:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
#include <set>
using namespace std; #define N 55 __int64 map[N][N];
__int64 dp[N][N][N][N];
int n, m; main()
{
int i, j, k, l;
int x, y, w;
while(scanf("%d %d",&n,&m)==){
memset(map,,sizeof(map));
memset(dp,,sizeof(dp));
for(i=;i<=n;i++){
for(j=;j<=m;j++){
scanf("%I64d",&map[i][j]);
}
}
for(i=;i<=n;i++){
for(j=;j<=m;j++){
for(k=;k<=n;k++){
for(l=;l<=m;l++){
dp[i][j][k][l]=max(dp[i][j][k][l],dp[i-][j][k-][l]);
dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j-][k-][l]);
dp[i][j][k][l]=max(dp[i][j][k][l],dp[i-][j][k][l-]);
dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j-][k][l-]);
dp[i][j][k][l]+=map[i][j]+map[k][l];
if(i==k&&j==l) dp[i][j][k][l]-=map[i][j];
}
}
}
}
printf("%I64d\n",dp[n][m][n][m]);
}
}

费用流:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
#include <set>
using namespace std; #define N 205
#define M 1005
#define inf 999999999 struct MCF{//min_cost_flow
struct Edge{
int v, f, w, next;
Edge(){};
Edge(int a,int b,int c,int d){
v=a;f=b;w=c;next=d;
}
};
int n;
int head[N+];
Edge e[M*];
int nume;
int src, sink; void init(int st, int end,int nn){//初始化
src=st;sink=end;n=nn;
memset(head,,sizeof(head));
nume=;
} void addedge(int u,int v,int c,int w){
e[++nume]=Edge(v,c,w,head[u]);
head[u]=nume;
e[++nume]=Edge(u,,-w,head[v]);
head[v]=nume;
} queue<int>Q;
bool visited[N];
int dis[N];
int prev[N], pree[N]; bool findpath(){ while(!Q.empty()) Q.pop();
Q.push(src);
for(int i=;i<=n;i++) dis[i]=-;
dis[src]=;
visited[src]=true;
while(!Q.empty()){
int u=Q.front();Q.pop();visited[u]=false;
for(int i=head[u];i;i=e[i].next){
if(e[i].f>&&dis[u]+e[i].w>dis[e[i].v]){
dis[e[i].v]=dis[u]+e[i].w;
prev[e[i].v]=u;
pree[e[i].v]=i;
if(!visited[e[i].v]){
Q.push(e[i].v);
visited[e[i].v]=true;
}
}
}
}//printf("111111\n");
if(dis[sink]>) return true;
else return false;
} int solve(){ int u=sink;
int flow=inf;
while(u!=src){
if(e[pree[u]].f<flow) flow=e[pree[u]].f;
u=prev[u];
}
u=sink;
while(u!=src){
e[pree[u]].f-=flow;
e[pree[u]^].f+=flow;
u=prev[u];
} return dis[sink]*flow;
} int mincostflow(){
int ans=;
while(findpath()){
ans+=solve();
}
return ans;
}
}mcf; int n;
int map[][]; int x, y, w; main()
{
int i, j, k;
while(scanf("%d",&n)==){
memset(map,,sizeof(map));
while(){ scanf("%d %d %d",&x,&y,&w);
if(x==&&y==&&w==) break;
map[x][y]=w;
}
mcf.init(,n*n*+,n*n*+);
mcf.addedge(,,,);
mcf.addedge(n*n*,n*n*+,,);
int temp=;
for(i=;i<=n;i++){
for(j=;j<=n;j++){
mcf.addedge(temp,temp+n*n,,map[i][j]);
mcf.addedge(temp,temp+n*n,,);
if(i<n) mcf.addedge(temp+n*n,temp+n,,);
if(j<n) mcf.addedge(temp+n*n,temp+,,);
temp++;
}
}
printf("%d\n",mcf.mincostflow());
}
}

洛谷 1004 dp或最大费用流的更多相关文章

  1. 洛谷P4003 无限之环(费用流)

    传送门 神仙题啊……不看题解我可能一年都不一定做得出来……FlashHu大佬太强啦 到底是得有怎样的脑回路才能一眼看去就是费用流啊…… 建好图之后套个板子就好了,那么我们着重来讨论一下怎么建图 首先, ...

  2. 洛谷P4012 深海机器人问题(费用流)

    题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...

  3. 洛谷P2517 HAOI2010 订货 (费用流)

    标准的费用流问题,关键在于巧妙地建模 一共有n个月份,源点设为0,汇点设为n+1 1.源点向所有月份连边,容量为正无穷,费用为该月进货的费用 2.每个月向下一个月连边,容量为仓库容量,费用为存货费用 ...

  4. 洛谷P4016 负载平衡问题 费用流

    这道题还是很好的. 考察了选手对网络流的理解. 首先,任意两个相邻点之间的运货量时没有限制的. 我们可以将相邻点之间的流量建为无限大,单位费用设为 1,代表运输一个货物需耗费一个代价. 由于题目要求最 ...

  5. 洛谷.1251.餐巾计划问题(费用流SPFA)

    题目链接 /* 每一天的餐巾需求相当于必须遍历某些点若干次 设q[i]为Dayi需求量 (x,y)表示边x容y费 将每个点i拆成i,i',由i'->T连(q[i],0)的边,表示求最大流的话一定 ...

  6. 洛谷P2770 航空路线问题(费用流)

    题意 $n$个点从左向右依次排列,有$m$条双向道路 问从起点到终点,再从终点回到起点,在经过的点不同的情况下最多能经过几个点 Sol 首先,问题可以转化为求两条互不相交的路径,使得点数最多 为了满足 ...

  7. 洛谷P4013 数字梯形问题(费用流)

    题意 $N$行的矩阵,第一行有$M$个元素,第$i$行有$M + i - 1$个元素 问在三个规则下怎么取使得权值最大 Sol 我只会第一问qwq.. 因为有数量的限制,考虑拆点建图,把每个点拆为$a ...

  8. 洛谷P3356 火星探险问题(费用流)

    题目描述 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车.登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动.探测车在移动中还必须采集岩石标本.每一块岩石标本由最先遇到它的探测 ...

  9. 洛谷 1373 dp 小a和uim之大逃离 良心题解

    洛谷 1373 dp 这题还不算太难,,当初看的时候不是很理解题意,以为他们会选择两条不同的路径,导致整体思路混乱 传送门 其实理解题意和思路之后还是敲了不短的时间,一部分身体原因再加上中午休息不太好 ...

随机推荐

  1. Java-坦克大战

    利用Java语言中的集合.Swing.线程等知识点编写一个坦克大战游戏.(1) 画出敌我坦克的原理:在坦克类里面有一个布尔类型变量good.用于判断坦克的阵营,在创建坦克对象时在Tank类的构造方法中 ...

  2. DSO的记录模式Record Mode字段测试

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. 自定义样式 实现文件控件input[type='file']

    一般我们设计的上传按钮都是和整个页面风格相似的样式,不会使用html原生态的上传按钮,但是怎么既自定义自己的样式,又能使用file控件功能呢? 思路是这样的: 1.定义一个相对定位的DIV,按照整成步 ...

  4. [bzoj1122][POI2008]账本BBB

    1122: [POI2008]账本BBB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 402  Solved: 202[Submit][Status ...

  5. JSON生成c#类代码小工具

    JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...

  6. [转] - Configuring Android Studio: IDE & VM Options, JDK, etc

    Configuring Android Studio: IDE & VM Options, JDK, etc You should not edit any files in the IDE ...

  7. VR视频外包公司(长年承接虚拟全景外包、虚拟现实视频外包)

    承接VR视频外包(虚拟全景外包),虚拟现实视频外包(北京公司) 我们制作各类型VR全景虚拟现实,增强现实视频制作.录制等项目! 品质保证,售后完备. 我们团队成立于2011年10月,是一个专业从事严肃 ...

  8. Nginx模块之———— RTMP模块 统计某频道在线观看流的客户数

    获得订阅者人数,可以方便地显示观看流的客户数. 查看已经安装好的模块 /usr/local/nginx/sbin/nginx -V 安装从源编译Nginx和Nginx-RTMP所需的工具 sudo a ...

  9. Android手机_软件01

    1.微信 下载:http://weixin.qq.com/ 2.QQ 下载:http://im.qq.com/download/ 3.滴滴打车(乘客端):http://www.xiaojukeji.c ...

  10. log4jWARN Please initialize the log4j system properly解决办法

    原因是没有对log4j这个jar进行文件配置. 要解决这个问题非常简单,建立LOG4J 的配置文件即可.在src 目录下创建配置文件,选择菜单File > New > File,文件名输入 ...