题目连接:

  http://lightoj.com/volume_showproblem.php?problem=1071

题目大意:

  一个n*m的格子,Baker Vai要从(1,1)到(n,m)再回到(1,1),每到一个格子可以收集格子上的数字(每个格子只能走一次,(1,1)这个格子除外),问最终搜集的数字之和最大为多少?

解题思路:

  可以把题目转化为求两个对象同时从(1,1)出发到(n,m)途中不能相遇,状态转移的时候可以用dp[step][x][y],step代表当前步数,x,y分别代表两者当前所在的行(所在列可以直接求出来)。

 #include <bits/stdc++.h>
using namespace std;
const int maxn = ;
const int INF = 0x3f3f3f3f; int Map[maxn][maxn], dp[maxn*][maxn][maxn];
int n, m;
int dfs (int step, int x, int y)
{
if (step == n + m - )
{//走到够了步数
if (x==y && x==n- && step-x==m-)
return Map[n-][m-];//刚好到了终点
else
return -INF;//不合法
}
int ans = dp[step][x][y];
if (ans != -)//前面已经搜过,直接返回
return ans;
if (x<n- && y<n-)//x,y都向下走
ans = max(ans, dfs(step+, x+, y+));
if (x<n- && step-y<m-)//x向下走.y向右走
ans = max(ans, dfs(step+, x+, y));
if (step-x<m- && y<n-)//x向右走.y向下走
ans = max(ans, dfs(step+, x, y+));
if (step-x<m- && step-y<m-)//x,y都向右走
ans = max(ans, dfs(step+, x, y));
ans += Map[x][step-x];//选择以上四种情况最优的一种,再加上当前的
if (x != y)//如果相同的话就不加,因为不走重复的一定比走重复的的要大
ans += Map[y][step-y];
dp[step][x][y] = ans;
return ans; }
int main ()
{
int t, Case = ;
scanf ("%d", &t);
while (t --)
{
scanf ("%d %d", &n, &m);
for (int i=; i<n; i++)
for (int j=; j<m; j++)
scanf ("%d", &Map[i][j]); memset (dp, -, sizeof(dp));
int res = dfs (, , ); printf ("Case %d: %d\n", ++Case, res);
}
return ;
}

Lightoj 1071 - Baker Vai (双线程DP)的更多相关文章

  1. LightOJ 1071 Baker Vai(拆点+最大费用流)题解

    题意:给一个n*m的方格,每个格子上都有一个数字表示价值,小A在左上角,他从左上角走到右下角只能向右或向下走,然后再从右下角走上左上角,这次只能向上或向左走,这两条路绝对没有重复,问你怎样走有最大价值 ...

  2. [Swust OJ 1084]--Mzx0821月赛系列之情书(双线程dp)

    题目链接:http://acm.swust.edu.cn/problem/1084/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  3. nyist 61 传纸条 nyist 712 探 寻 宝 藏(双线程dp问题)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=61 http://acm.nyist.net/JudgeOnline/problem.php?pid ...

  4. 传纸条(一)(双线程dp)

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...

  5. UVa 1347 (双线程DP) Tour

    题意: 平面上有n个坐标均为正数的点,按照x坐标从小到大一次给出.求一条最短路线,从最左边的点出发到最右边的点,再回到最左边的点.除了第一个和最右一个点其他点恰好只经过一次. 分析: 可以等效为两个人 ...

  6. 51Nod 1084 矩阵取数问题 V2 双线程DP 滚动数组优化

    基准时间限制:2 秒 空间限制:131072 KB  一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上.第1遍时只能向下和向右走,第2遍时只能向 ...

  7. hdu 2686 费用流 / 双线程DP

    题意:给一个方阵,求从左上角出到右下角(并返回到起点),经过每个点一次不重复,求最大获益(走到某处获得改点数值),下来时每次只能向右或向下,反之向上或向左. 俩种解法: 1  费用流法:思路转化:从左 ...

  8. NYOJ 61传纸条(一) 双线程DP问题

    http://www.cnblogs.com/HpuAcmer/archive/2012/05/06/2486591.html 题目链接:http://acm.nyist.net/JudgeOnlin ...

  9. 双线程DP

    1.传纸条 好像是一道普及组水题? //Twenty #include<cstdio> #include<iostream> #include<cstring> # ...

随机推荐

  1. Codeforces554E:Love Triangles

    There are many anime that are about "love triangles": Alice loves Bob, and Charlie loves B ...

  2. Linux面试题完整修订附加答案

    册一: 1.Linux挂载Winodws共享文件夹 第一步:先在Windows上创建一个共享目录        Windows系统IP是172.16.18.56;共享文件夹:E:\test       ...

  3. 【笨木头Lua专栏】基础补充07:协同程序初探

    哎.周五晚上我都还这么努力看书.真是好孩子.(小若:不想吐槽了) 事实上我都准备rs=1&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F17 ...

  4. vue 自定义报警组件

    1.自定义报警组件 Alarm.vue <!-- 报警 组件 --> <template> <div class="alarm"> <!- ...

  5. ==和equals的差别

    == 和 Equals 的差别 1. == 是一个运算符. 2.Equals则是string对象的方法.能够.(点)出来. 我们比較无非就是这两种 1.基本数据类型比較 2.引用对象比較 1.基本数据 ...

  6. 2012年公司组织旅游西安线个人记录(repost)

    2012年公司组织旅游西安线个人记录 文件夹 [隐藏]  1 序言 2 第1天 3 第2天 4 第3天 5 第4天 6 第5天 [title=2012%E5%B9%B4%E5%85%AC%E5%8F% ...

  7. JavaScript语言基础12

    使用if语句时.假设碰到很多个条件时,就不应该继续使用if语句了,JavaScript提供了一个更高效的替代方案,那就是switch语句,我们先看看switch语句的模板: <HTML> ...

  8. 6.游戏特别离不开脚本(3)-JS脚本操作java(2)(直接解析JS公式,并非完整JS文件或者函数)

    在游戏中可以考虑数据由javabean保存,逻辑方法由JS提供. public class Bean4JS { private int id; private String name; private ...

  9. C控制台密码输入:输入一个字符显示一个星号

    要在c控制台中输入一个字符显示一个星号, 则不能用"stdio.h'提供的库函数,因为它们都是带回显的,比如getchar() getchar()用来接收输入的字符串,输入一个字符就回显一个 ...

  10. Why was 80 Chosen as the Default HTTP Port and 443 as the Default HTTPS Port?

    https://www.howtogeek.com/233383/why-was-80-chosen-as-the-default-http-port-and-443-as-the-default-h ...