题目链接:https://www.luogu.org/problemnew/show/P1004

题目描述

设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放

人数字0。如下图所示(见样例):

A
0 0 0 0 0 0 0 0
0 0 13 0 0 6 0 0
0 0 0 0 7 0 0 0
0 0 0 14 0 0 0 0
0 21 0 0 0 4 0 0
0 0 15 0 0 0 0 0
0 14 0 0 0 0 0 0
0 0 0 0 0 0 0 0
. B

某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B

点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。

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

输入输出格式

输入格式:

输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个

表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。

输出格式:

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

输入输出样例

输入样例#1: 

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
输出样例#1: 

67
四维dp数组:
将这两条路线看成是两个人同时走不同的路线,开一个四维dp数组记录下这两人的坐标。
#include <bits/stdc++.h>
using namespace std;
int mapp[][];
int dp[][][][]; //两条路线,既可以假设为两个人同时走不同的路线,dp[i][j][k][l]表示这两个人走到该点取数的最大和
//mapp[i][j]为第一人的坐标,mapp[k][l]为第二人的坐标
int main()
{
int n, x, y, m;
cin >>n>> x >> y >> m;
while (x != || y != || m != )
{
mapp[x][y] = m;
cin >> x >> y >> m;
}
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
for(int k=;k<=n;k++)
for (int l = ; l <= n; l++)
{ //由于任意一点mapp[i][j]只能由mapp[i-1][j],或者mapp[i][j-1]达到,且控制这两个人的步数相同(即i和j中有且仅有一个数-1,k和l中有且仅有一个数-1),所以总共由4种情况要考虑
dp[i][j][k][l] = max(max(dp[i][j-][k-][l], dp[i][j - ][k][l-]), max(dp[i-][j][k - ][l], dp[i-][j][k][l - ])) + mapp[i][j] + mapp[k][l];
if (i == k && j == l)dp[i][j][k][l] -= mapp[i][j]; //由于方格中的数只能取一次,所以如果这两个人走到了同一个点,mapp[i][j]只能加一次
}
cout << dp[n][n][n][n];
return ;
}
接下来是对以上四维dp的优化,三维dp数组也能解决

定义d[i][j][k]为走了i步,路径a向下走了j步,路径b向下了k步,取数和的最大值;

此时(i-j),(i-k)就是a与b此时到达点的纵坐标;其它的地方都与四维dp类似

#include <bits/stdc++.h>
using namespace std;
int mapp[][];
int f[][][];
int n, x, y, z;
int main()
{
scanf("%d", &n);
memset(f, , sizeof(f));
memset(mapp, , sizeof(mapp));
while (scanf("%d%d%d", &x, &y, &z), x || y || z)
mapp[x][y] = z;
for (int k = ; k <= * n - ; k++)
{
for (int i = ; i <= min(k, n); i++)
{
for (int j = ; j <= min(n, k); j++)
{
f[k][i][j] = max(max(f[k - ][i][j], f[k - ][i][j - ]), max(f[k - ][i - ][j], f[k - ][i - ][j - ]));
if (i == j) f[k][i][j] += mapp[i][k - j + ];
else f[k][i][j] += mapp[i][k - i + ] + mapp[j][k - j + ];
}
}
}
printf("%d\n", f[ * n - ][n][n]);
return ;
}
2018-05-15

洛谷 P1004 方格取数 【多进程dp】的更多相关文章

  1. 洛谷P1004 方格取数-四维DP

    题目描述 设有 N \times NN×N 的方格图 (N \le 9)(N≤9) ,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 00 .如下图所示(见样例): A 0 0 0 0 0 ...

  2. 洛谷 - P1004 - 方格取数 - 简单dp

    https://www.luogu.org/problemnew/show/P1004 这道题分类到简单dp但是感觉一点都不简单……这种做两次的dp真的不是很懂怎么写.假如是贪心做两次,感觉又不能证明 ...

  3. 棋盘DP三连——洛谷 P1004 方格取数 &&洛谷 P1006 传纸条 &&Codevs 2853 方格游戏

    P1004 方格取数 题目描述 设有N $\times N$N×N的方格图(N $\le 9$)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00.如下图所示(见样例): A ...

  4. 洛谷 P1004 方格取数 题解

    P1004 方格取数 题目描述 设有 \(N \times N\) 的方格图 \((N \le 9)\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字\(0\).如下图所示(见样例): ...

  5. 洛谷P1004 方格取数

    网络流大法吼 不想用DP的我选择了用网络流-- 建模方法: 从源点向(1,1)连一条容量为2(走两次),费用为0的边 从(n,n)向汇点连一条容量为2,费用为0的边 每个方格向右边和下边的方格连一条容 ...

  6. 洛谷 P1004 方格取数 【多线程DP/四维DP/】

    题目描述(https://www.luogu.org/problemnew/show/1004) 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0. ...

  7. 洛谷 P1004 方格取数

    题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...

  8. 【动态规划】洛谷P1004方格取数

    题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...

  9. 四维动规 洛谷P1004方格取数

    分析:这个题因为数据量非常小,可以直接用四维的DP数组 dp[i][j][k][l]表示第一个人走到位置(i,j),第二个人走到位置[k][l]时所取的数的最大和 状态转移方程可以轻松得出为:dp[i ...

随机推荐

  1. 第16月第12天 CABasicAnimation 旋转加速

    1. ; double duration = 10.0f; ; i<count; i++) { //旋转动画 CABasicAnimation *anima3 = [CABasicAnimati ...

  2. <转载>iTerm2使用技巧

    原文链接:http://www.cnblogs.com/756623607-zhang/p/7071281.html   1.设置窗口 定位到 [Preferences - Profiles - Wi ...

  3. Native、Web App、Hybrid、React Native(简称RN)、Weex 间的异同点。

    App常用开发模式简介 此处App为应用application,并非我们通常讲的手机App. 常用的几种APP开发模式-脑图 Native App 传统的原生App开发模式,有iOS和aOS两大系统, ...

  4. jquery 学习(六) - 事件绑定

    HTML <!--绑定事件--> <div class="a1"> <button class="bt">按钮</bu ...

  5. Hadoop的RPC机制及简单实现

    1.RPC简介 Remote Procedure Call 远程过程调用协议 RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...

  6. 【CXF】: No binding operation info while invoking unknown method with params unknown.

    CXF发布webservice之后访问报错: org.apache.cxf.interceptor.Fault: No binding operation info while invoking un ...

  7. 用NDK调用第三方库

    用NDK调用第三方库遇到不少坑,总结一下. 1.添加JNI目录 参考: http://www.cnblogs.com/lanqie/p/7442668.html 2.文件介绍: 其中:JniFacto ...

  8. ftruncate(改变文件大小)

    ftruncate(改变文件大小) 定义函数 int ftruncate(int fd,off_t length); 函数说明 ftruncate()会将参数fd指定的文件大小改为参数length指定 ...

  9. jvm系列三、java GC算法 垃圾收集器

    原文链接:http://www.cnblogs.com/ityouknow/p/5614961.html 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 ...

  10. 基于url拦截