题目描述 Description

设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例):

某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。

此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。

输入描述 Input Description

输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。

输出描述 Output Description

只需输出一个整数,表示2条路径上取得的最大的和。

样例输入 Sample Input

8

2  3  13

2  6   6

3  5   7

4  4  14

5  2  21

5  6   4

6 3  15

7 2  14

0 0  0

样例输出 Sample Output

67

路一:
我们设f[i,j,k,l]表示第一条路走到(i,j),第二条路走到(k,l)的路线。
那么状态转移方程很好得出:
f[i,j,k,l]=max{f[i-1,j,k-1],f[i-1,j,k,l-1],f[i,j-1,k-1,l],f[i,j-1,k,l-1]}+(i==k&&j==l ? a[i][j] : a[i][j]+a[k][l])
值得注意的是:最后加上这个值的时候要注意如果路径走到同一点不能重复统计。
时间复杂度:O(n4),空间复杂度O(n4),对于本题n<=10完全足够。
思路二:
虽然思路一对于本题完全足够,但是如果n的范围大些的话,就无法办到了。
针对思路一,我们发现了问题,有一些状态是可以合并的,最重要的是:思路一,我们是同时开始走的,那么不必记录向右、向下的具体路径,只需要记录步数,显然,两条路的步数是统一的,然后再记录向下或向右的次数,就能根据这两者推算出向下或向右的次数。
那么设f[i,j,k]表示走到了第i步,第一条路径向走了j步,第二条路径向走了k步。
那么f[i,j,k]=max{f[i-1,j,k],f[i-1,j-1,k],f[i-1,j-1,k-1],f[i-1,j,k-1]}+(j==k ? a[i-j+1][i] : a[i-j+1][j]+a[i-k+1][k]);
显然,我们也要判断路径是否走到同一点,所以有后面的那个if( ? : 三目运算符)
时间复杂度:O(2n3),空间复杂度O(2n3),优化了一维。从n的四方优化至n的三方,是一个很大的进步。
至于代码,只要思路知道了,就无所谓了。
因为的线性的原因所以可以开二维
代码复杂度不高,50行足矣。
 
#include<bits/stdc++.h>
using namespace std ;
int G[][],dp[][];
int main( )
{
int n;
scanf("%d",&n);
int u,v,w;
for(int i= ; i<=n ; i++)
for(int j= ; j<=n ; j++)
G[i][j]=;
while(scanf("%d%d%d",&u,&v,&w)!=EOF)
{
if(u==&&v==&&w==)
break;
G[u][v]=w;
}
for(int k= ; k<=*n- ; k++)
{
for(int i=k ; i>= ; i--)
{
for(int j=k ; j>= ; j--)
{
dp[i][j]=max(max(dp[i][j],dp[i-][j]),max(dp[i][j-],dp[i-][j-]))+( i == j ? G[k-i+][j] : G[k-j+][j] + G[k-i+][i] );
}
}
}
printf("%d\n",dp[n][n]);
}

多线程DP (要一起行动才可以)的更多相关文章

  1. Matrix(多线程dp)

    Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  2. HDU 2686 Matrix 多线程dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 思路:多线程dp,参考51Nod 1084:http://www.51nod.com/onlin ...

  3. codevs1169, 51nod1084(多线程dp)

    先说下codevs1169吧, 题目链接: http://codevs.cn/problem/1169/ 题意: 中文题诶~ 思路: 多线程 dp 用 dp[i][j][k][l] 存储一个人在 (i ...

  4. 51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1084 1084 矩阵取数问题 V2  基准时间限制:2 秒 空 ...

  5. 8786:方格取数 (多线程dp)

    [题目描述] 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点.在走 ...

  6. 51nod 1503 多线程dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503 1503 猪和回文 题目来源: CodeForces 基准时间限制 ...

  7. NBOJv2——Problem 1002: 蛤玮的财宝(多线程DP)

    Problem 1002: 蛤玮的财宝 Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format:  %ll ...

  8. TYVJ 1011 NOIP 2008&&NOIP 2000 传纸条&&方格取数 Label:多线程dp

    做题记录:2016-08-15 15:47:07 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...

  9. (多线程dp)Matrix (hdu 2686)

    http://acm.hdu.edu.cn/showproblem.php?pid=2686     Problem Description Yifenfei very like play a num ...

随机推荐

  1. PopupWindow-----点击弹出 PopupWindow 初始化菜单

    /** * 点击弹出 PopupWindow 初始化菜单 */ private void initPopupWindow() { PopupWindowAdapter adapter = new Po ...

  2. day17-jdbc 7.Statement介绍

    SQL语句:DML.DQL.DCL.DDL.DML和DQL是用的最多的.DCL和DDL用的很少. 程序员一般是操作记录,创建一表很少. package cn.itcast.jdbc; import c ...

  3. input框去只读

    设置为只读 $('input[name=video_link]').attr("readonly","readonly"); 去只读 $("#vide ...

  4. 构建一个在线ASCII视频流服务

    构建一个在线ASCII视频流服务 2018-03-26  正常的文章 1685 什么是ASCII视频流服务? 其实这个名字是咱胡乱起的,具体叫啥我也不清楚,但效果如下: 大家可以在自己的命令行里试下, ...

  5. CSS相关知识和经验的碎片化记录

    1.子DIV块中设置margin-top时影响父DIV块位置的问题 解决办法1:若子DIV块中使用margin-top,则在父DIV块中添加:overflow:hidden; 解决办法2:在子DIV块 ...

  6. (数组)字符串的回文构词法( anagrams)

    题目:https://www.nowcoder.com/practice/e84e273b31e74427b2a977cbfe60eaf4?tpId=46&tqId=29130&tPa ...

  7. 简单的linux service(linux服务)编写,运行示例

    1.写一个简单小程序 #include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) { while(1 ...

  8. 从底层了解ASP.NET体系结构

    导读:  前言  关于ASP.NET的底层的工作机制,最近园子里讨论的甚是火热.相信很多人都看过Rick Strahl先生的一篇经典之作:A low-level Look at the ASP.NET ...

  9. Google准实时数据仓库Mesa(一)

    本文来自网易云社区 作者:王潘安 以下是本人在学习Google的Mesa数据仓库论文的记录,翻译出来给大家分享,翻译水平有限,请多多包涵.因论文比较长,本人将论文按照Mesa不同的模块分开翻译,方便阅 ...

  10. 正经学C#_委托

    以前不会,甚至连想去学都没想.啧啧啧,我是何等朽木啊. 我先不说其中理念,或者原理,咱就先说最简单的用法.怎么去使用委托. 委托 Delegate 使用委托,就要先定义一个委托.定义一个委托就要先声明 ...