[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给班上每个人定义了一个保密程度值(就是这个人不偷看纸条内容的可能),每个人传递纸条只能给前后左右的人。

Mzx0821还考虑到万一Zzx给Mzx0821回纸条怎么办呢,为了保密,Mzx0821希望每个人最多传递一次纸条,就是说一个人在Mzx0821传给Zzx的时候帮了忙,就不能再帮Zzx传给Mzx0821,反之亦然。

Mzx0821希望找到这样两条路,使得来回两条路上的保密程度值的和最大,为了尽快传到,这两条路必须是Mzx0821到Zzx的之间的最短路。

Mzx0821智商实在捉急,于是向机智的学弟学妹们求助,你能帮助他找到正确的路线吗?

Input

输入第一行有2个用空格隔开的整数m和n,表示班里有m行n列(1<=m,n<=50)。

为了简化问题我们假设Mzx0821坐在左上角,Zzx坐在右下角。

接下来的m行是一个m*n的矩阵,矩阵中第i行j列的整数表示坐在第i行j列的学生的保密程度。每行的n个整数之间用空格隔开。

友情提示:Mzx0821坐标点的值和Zzx坐标点的值为0,坐标点的值<10000。

Output

输出共一行,包含一个整数,表示来回两条路上参与传递纸条的学生的保密程度之和的最大值。

Sample Input


3 3

0 3 9

2 8 5

5 7 0

Sample Output

34

输出换行请使用\r\n

解题思路:一个简单的双线程dp,直接写就是了,两个人同一个方向同时走,dp[i][j][x][y],代表第一个人走到(i,j),第二个人走到(x,y)的最大值,

     然后注意第二个人走的路径在第一个人的下方,dp方程如下,具体可见代码注释~~~

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

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 #define maxn 51
 8 int m, n, map[maxn][maxn];
 9 int dp[maxn][maxn][maxn][maxn];
10 //同一个方向同时走
11 //dp[i][j][x][y]代表当第一个人走到i,j且第二个人走到x,y时的最大值
12
13 int max(int x, int y, int z, int w){
14     return max(max(max(x, y), z), w);
15 }
16 int main()
17 {
18     while (cin >> m >> n){
19         memset(dp, 0, sizeof(dp));
20         for (int i = 1; i <= m; i++)
21         for (int j = 1; j <= n; j++)
22             cin >> map[i][j];
23         for (int i = 1; i <= m; i++){
24             for (int j = 1; j <= n; j++){
25                 //第二个人走的路径在第一个人的下面,
26                 for (int k = i + 1; k <= m; k++){
27                     int l = i + j - k;
28                     if (l <= 0)continue;
29                     dp[i][j][k][l] = max(dp[i - 1][j][k - 1][l], dp[i - 1][j][k][l - 1], dp[i][j - 1][k][l - 1], dp[i][j - 1][k - 1][l]) + map[i][j] + map[k][l];
30                 }
31             }
32         }
33         //最后第一个人到终点的左边,第二个人到终点的右边
34         printf("%d\r\n", dp[m - 1][n][m][n - 1]);
35     }
36     return 0;
37 }

时间: 2024-11-07 14:02:01

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

swust oj 1026--Egg pain&#39;s hzf

题目链接:http://acm.swust.edu.cn/problem/1026/ Time limit(ms): 3000 Memory limit(kb): 65535 hzf is crazy about reading math recently,and he is thinking about a boring problem. Now there are n integers Arranged in a line.For each integer,he wants to know

SWUST OJ Euclid&#39;s Game(0099)

Euclid's Game(0099) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 1855 Accepted: 589 Description Starts with two unequal positive numbers (M,N and M>N) on the board. Two players move in turn. On each move, a player has to write on the boar

西电oj 6月月赛

西电oj 6月月赛 最近确实比较累,加上天气很热,宿舍一群人在打游戏,同时由于本身自己思维题做的不多,所以这次月赛自然而然的被虐了. 不过还是写写总结,顺便留坑以后补题解. A题,水题,但最近手速慢下来了,得多做题了. B题,水题,虽然题面看半天没懂,交了两次WA之后还是过了,看错题对手速狗来说是绝对不允许出现的,WA也不应该在能做的题出现. C题,这题很多人过了.这次没做出来只能说是运气不好,这种题做出来算自己运气好,做不出来算运气不好.这次这道题是用总情况减去掉异构的情况,最后得到答案,奇数

swust oj 649--NBA Finals(dp,后台略(hen)坑)

题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two teams, Lakers and Celtics, playing a series of NBA Finals until one of the teams wins n games. Assume that the probability of Lakers winning a game is

线段树 [SWUST OJ 764] 校门外的树 Plus Plus

校门外的树 Plus Plus(0764) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 214 Accepted: 15 Description 西南某科技大学的校门外长度为 L 的公路上有一排树,每两棵相邻的树之间的间隔都是 1 米.我们可以把马路看成一个数轴,马路的一端在数轴 1 的位置,另一端在 L 的位置:数轴上的每个整数点,即 1,2,……,L,都种有一棵树. 现在要将这排树的某一段涂成某种颜色,给定 N 组区间[ 

背包 [POJ 2184 SWUST OJ 145] Cow Exhibition

Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9479   Accepted: 3653 Description "Fat and docile, big and dumb, they look so stupid, they aren't much  fun..."  - Cows with Guns by Dana Lyons The cows want to prove to

ACdream oj C - 神奇的%系列一 (水题系列--略坑)

 C - 神奇的%系列一 Time Limit: 6000/3000 MS (Java/Others)      Memory Limit: 65536/32768 KB (Java/Others) Submit Status Problem Description 在计算机的世界里,%不是百分比,而是除法取余哟! 比如: 4 % 2 = 0 5 % 3 = 2 给你 2<=N<=100000 个数,a[1],a[2]...a[i]...a[n]. 其中:1<=a[i]<=10

[Swust OJ 404]--最小代价树(动态规划)

题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 以下方法称为最小代价的字母树:给定一正整数序列,例如:4,1,2,3,在不改变数的位置的条件下把它们相加,并且用括号来标记每一次加法所得到的和. 例如:((4+1)+ (2+3))=((5)+(5))=10.除去原数不4,1,2,3之外,其余都为中间结果,如5,5,10,将中间结果相加

线程系列02,多个线程同时处理一个耗时较长的任务以节省时间

当面对一个耗时较长的任务时,我们可以把这个任务切分成多个部分,然后同时交给多个线程处理. □ 统计字节数组一个比较耗时的方式 以下来统计一个字节数组的大小. class Program { static byte[] values = new byte[500000000]; static void Main(string[] args) { GenerateByteArray(); Console.WriteLine("正在统计字节数"); Stopwatch watch = new