Lightoj 1071 - Baker Vai (双线程DP)

题目连接:

  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分别代表两者当前所在的行(所在列可以直接求出来)。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 105;
 4 const int INF = 0x3f3f3f3f;
 5
 6 int Map[maxn][maxn], dp[maxn*2][maxn][maxn];
 7 int n, m;
 8 int dfs (int step, int x, int y)
 9 {
10     if (step == n + m - 2)
11     {//走到够了步数
12         if (x==y && x==n-1 && step-x==m-1)
13             return Map[n-1][m-1];//刚好到了终点
14         else
15             return -INF;//不合法
16     }
17     int ans = dp[step][x][y];
18     if (ans != -1)//前面已经搜过,直接返回
19         return ans;
20     if (x<n-1 && y<n-1)//x,y都向下走
21         ans = max(ans, dfs(step+1, x+1, y+1));
22     if (x<n-1 && step-y<m-1)//x向下走.y向右走
23         ans = max(ans, dfs(step+1, x+1, y));
24     if (step-x<m-1 && y<n-1)//x向右走.y向下走
25         ans = max(ans, dfs(step+1, x, y+1));
26     if (step-x<m-1 && step-y<m-1)//x,y都向右走
27         ans = max(ans, dfs(step+1, x, y));
28     ans += Map[x][step-x];//选择以上四种情况最优的一种,再加上当前的
29     if (x != y)//如果相同的话就不加,因为不走重复的一定比走重复的的要大
30         ans += Map[y][step-y];
31     dp[step][x][y] = ans;
32     return ans;
33
34 }
35 int main ()
36 {
37     int t, Case = 0;
38     scanf ("%d", &t);
39     while (t --)
40     {
41         scanf ("%d %d", &n, &m);
42         for (int i=0; i<n; i++)
43             for (int j=0; j<m; j++)
44                 scanf ("%d", &Map[i][j]);
45
46         memset (dp, -1, sizeof(dp));
47         int res = dfs (0, 0, 0);
48
49         printf ("Case %d: %d\n", ++Case, res);
50     }
51     return 0;
52 }
时间: 2024-10-08 10:44:26

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

蓝桥杯 - 传纸条 (双线程DP)

题目传送:传纸条 思路:双线程DP,具体看代码; AC代码: #include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <string> #include <vecto

浅谈双线程dp (nyoj61 nyoj712)经典【传字条】和【探 寻 宝 藏】

浅谈双线程dp 先看问题: 传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊传到小轩的纸条只可以向下或者向右传递,从小轩

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

题目链接:http://acm.swust.edu.cn/problem/1084/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 小时候,Mzx0821暗恋班上的一个妹子Zzx. 一次班上做活动,班上同学被安排坐成m行n列的矩阵,Mzx0821坐在坐标(x1,y1)的位置,Zzx坐在坐标(x2,y2)的位置.活动过程中,Mzx0821写了一张纸条想给Zzx,但是Mzx0821又不想班上其他人看到他写的内容,于是Mzx0821给

hdu 2686 费用流 / 双线程DP

题意:给一个方阵,求从左上角出到右下角(并返回到起点),经过每个点一次不重复,求最大获益(走到某处获得改点数值),下来时每次只能向右或向下,反之向上或向左. 俩种解法: 1  费用流法:思路转化:从左上角流出2的流量,(表示走俩条路),归于右下角,可以走就有边(右和下),权为负的费用,源点连起点,汇点连终点,流量为2. 除源汇外所有点一分为2,Y向X对应点有流量1的边,之前边为X到Y的(原图),这样处理解决每个点只最多走一次(除了源汇外)(X部只出,Y部要出必先回到X对应点).跑最小费用最大流即

TYVJ 1011 传纸条(双线程DP)

P1011 传纸条 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊传到小轩的纸条

UVa 1347 (双线程DP) Tour

题意: 平面上有n个坐标均为正数的点,按照x坐标从小到大一次给出.求一条最短路线,从最左边的点出发到最右边的点,再回到最左边的点.除了第一个和最右一个点其他点恰好只经过一次. 分析: 可以等效为两个人从第一个点出发,沿不同的路径走到最右点. d(I, j)表示点1~max(I, j)这些点全部都走过,而且两人的位置分别是i和j,最少还需要走多长的距离.由这个定义可知,d(I, j) == d(j, i),所以我们再加一个条件,d(I, j)中i>j 这样状态d(I, j)只能转移到d(i+1,

双线程dp

zznu 1625 详解链接:http://blog.csdn.net/su20145104009/article/details/51277041 #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<cctype> #include<algorithm> #include <vector> #include <q

hdu1007 平面最近点对(暴力+双线程优化)

突发奇想,用双线程似乎可以优化一些暴力 比如说平面最近点对这个题目,把点复制成2份 一份按照x排序,一份按照y排序 然后双线程暴力处理,一份处理x,一份处理y 如果数据利用x递减来卡,那么由于双线程,它卡不住y 如果数据利用y递减来卡,那么卡不住x 这样暴力n^2就可以过了 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algori

多线程十大经典案例之一 双线程读写队列数据

本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5136035 转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8646902 欢迎关注微博:http://weibo.com/MoreWindows 在<秒杀多线程系列>的前十五篇中介绍多线程的相关概念,多线程同步互斥问题<秒杀多线程第四篇一个经典的多线程同步问题>及解决多线程同步互斥的常用方法