今天发现自己完全对这种dp没有思路……我果然太蒻了。/落泪.jpg

对于一个N*N的方格图中选择两条线路从左上角到右下角,其实只要用一个数组f[i][j][p][q]记录一个人走到(i,j)另一个人走到(p,q)的最优解就好啦。

由于行进的方向是固定的,即只可以向右或向下,所以只可能有四种情况:f[i-1][j][p-1][q],f[i-1][j][p][q-1],f[i][j-1][p-1][q],f[i][j-1][p][q-1]。

得到状态转移方程: f[i][j][p][q]=max(f[i-][j][p-][q],max(f[i-][j][p][q-],max(f[i][j-][p-][q],f[i][j-][p][q-])))+d[i][j]+d[p][q];

代入具体题目进行分析。

例题一 P1004 方格取数

四维dp模板题

分析对于走过后数字变为0的情况,其实只要判断在两条路径重复时减去d[i][j]就好了。

代码:

#include<iostream>
#include<cstdio> using namespace std; int n;
int d[][],f[][][][]; int main()
{
scanf("%d",&n);
while()
{
int x,y,v;
scanf("%d%d%d",&x,&y,&v);
if(x==y&&y==v&&v==) break;
d[x][y]=v;
} for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
for(int p=;p<=n;++p)
for(int q=;q<=n;++q)
{
f[i][j][p][q]=max(f[i-][j][p-][q],max(f[i-][j][p][q-],max(f[i][j-][p-][q],f[i][j-][p][q-])))+d[i][j]+d[p][q];
if(i==p&&j==q) f[i][j][p][q]-=d[i][j];//去重
} printf("%d\n",f[n][n][n][n]); return ;
}
例题二 P1006 传纸条
与上一题不同,这一题的两条线路无法重叠。而这两条不重叠的线路:

一定是一条在上一条在下的!

所以p只要枚举i+1~m。

又因为p的限定,i是肯定无法枚举到m的,所以我们的答案只要等价的输出f[m-1][n][m][n-1](实际上也是唯一解),因为(m-1,n)和(n,m-1)达到(m,n)都不用加上好心程度嘛。

代码:
#include<iostream>
#include<cstdio> using namespace std; int m,n;
int d[][],f[][][][]; int main()
{
scanf("%d%d",&m,&n);
for(int i=;i<=m;++i)
for(int j=;j<=n;++j)
scanf("%d",&d[i][j]); for(int i=;i<=m;++i)
for(int j=;j<=n;++j)
for(int p=i+;p<=m;++p) //避免两条线路重合
for(int q=;q<n;++q)
f[i][j][p][q]=max(f[i-][j][p-][q],max(f[i-][j][p][q-],max(f[i][j-][p-][q],f[i][j-][p][q-])))+d[i][j]+d[p][q]; printf("%d\n",f[m-][n][m][n-]); return ;
}

 
 

有关同时进行两条线路的四维dp的更多相关文章

  1. CodeForces 682D Alyona and Strings (四维DP)

    Alyona and Strings 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/D Description After re ...

  2. luoguP1004 方格取数(四维DP)

    题目链接:https://www.luogu.org/problemnew/show/P1004 思路: 这道题是四维DP的模板题,与luoguP1006传纸条基本相似,用f[i][j][k][l]表 ...

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

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

  4. 四维dp,传纸条,方格取数

    四维dp例题 四维dp便是维护4个状态的dp方式 拿题来说吧. 1. 洛谷P1004 方格取数 #include<iostream> #include<cstdio> usin ...

  5. HDU 2196 Computer (树上最长路)【树形DP】

    <题目链接> 题目大意: 输出树上每个点到其它点的最大距离. 解题分析: 下面的做法是将树看成有向图的做法,计算最长路需要考虑几种情况. dp[i][0] : 表示以i为根的子树中的结点与 ...

  6. Problem D: 乌龟棋【四维dp】

    Problem D: 乌龟棋 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 24  Solved: 15[Submit][Status][Web Boa ...

  7. P1004 方格取数(四维dp)

    P1004 方格取数 思路如下 这题是看洛谷大佬的思路才写出来的,所以我会把大佬的思路展示如下: 1⃣️:我们可以找到一个叫思维dp的东西,dp[i][j][k][l],其中前两维表示一个人从原点出发 ...

  8. codevs1068乌龟棋-四维DP,五维如何缩减一维

    我们从起点x开始暴力枚举所有决策 于是可以得到如下转移 void dfs(int x,int A,int B,int C,int D,int y) { if (x==n) {ans=max(ans,y ...

  9. HDU 2861 四维dp打表

    Patti and Terri run a bar in which there are 15 stools. One day, Darrell entered the bar and found t ...

随机推荐

  1. $objPHPExcel=$objReader->load() 报错路径不存在

    PHPexcel导入excel内容到数据库出错, $objPHPExcel=$objReader->load()报错 Could not open /public/upload/20191028 ...

  2. C3线性化

    https://zh.wikipedia.org/wiki/C3线性化 在计算机科学中,C3算法主要用于确定多重继承时,子类应该继承哪一个父类的方法,即方法解析顺序(Method Resolution ...

  3. Elasticsearch和Head插件安装(转)

    环境: CentOS7  Elasticsearch-6.3.2 JDK8 准备: JDK8 下载地址:http://www.oracle.com/technetwork/java/javase/do ...

  4. Windows下压缩包安装Mysql

    1. 下载mysql压缩包 2. 解压到指定目录,例如D:\Program Files\mysql-5.7.25-winx64 3. 在目录下创建配置文件my.ini [mysqld] port = ...

  5. git如何删除远程tag?

    答: 分为两步: 1. 删除本地tag git tag -d tag-name 2. 删除远程tag git push origin :refs/tags/tag-name

  6. Tomcat中用JNDI方式加载JDBC DataSource以连接数据库

    概括一下,大致分为四步:安装驱动,填充context.xml,填充web.xml,编写程序取得连接.通过一个小DEMO对这种配置方式有了一点了解,以tomcat6.0连接mysql5.0.8数据库为例 ...

  7. Ajax serialize()提交form表单不能上传file类型

    前台form表单的提交方式有很多种,例如: 1. form表单submit直接提交的方法 2. Ajax提交的方法 3. jquery提交的方法 4. 原生js提交的方法 每一种方法都有它的优势和不足 ...

  8. 十九款web漏洞扫描工具

    1. Arachni Arachni是一款基于Ruby框架搭建的高性能安全扫描程序,适用于现代Web应用程序.可用于Mac.Windows及Linux系统的可移植二进制文件. Arachni不仅能对基 ...

  9. pip 安装指定版本

    pip在安装包的时候可以不需要从网上下载,以windows的scipy为例 pip install scipy==0.15.1 以上表示安装0.15.1版本的scipy,这里用”==”接版本,如果权限 ...

  10. Locust-参数化批量注册(还没试,目测试可以的)

    前言 实现场景:所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复.例如,模拟10用户并发注册账号,总共有100个手机号,要求注册账号不重复,注册完毕后结束测试 准备数据 虚拟用户 ...