这也是当初卡了很久的一道题

题意:从左上角的格子出发选一条路径到右上角然后再回到左上角,而且两条路径除了起点和终点不能有重合的点。问所经过的格子中的最大和是多少

状态设计:我们可以认为是从左上角出发了两条路径,然后同时到达右下角。容易看出,第k个阶段所有可能到达的格子构成一条斜线而且满足x1 + y1 = x2 + y2 = k + 1

dp[k][x1][x2]表示第k阶段两条路分别到达(x1, y1) (x2, y2)所能取得的最大值(y1 y2根据上面的等量关系来计算),如果x1 = x2表示两条路径汇合于一点了

状态转移方程:

在求解第k阶段最优解时,首先枚举k-1阶段时的状态(x1', x2'),然后向四个方向延伸出(x1, x2)

dp[k][x1][x2] = max{dp[k-1][x1'][x2'] + num[x1][y1] | (x1=x2),  dp[k-1][x1'][x2'] + num[x1][y1] + num[x2][y2] | (x1≠x2)}

在循环的过程中可能会出现从一个点延伸的下一个点的情况,即两条路径可能重合,不过不要紧,因为格子里面都是正数,所以得到的最优解一定是两条不重合的路径

优化:

因为两条路径具有任意性,所以不妨规定第一条路在第二条路的下方(或同一水平线),时间从92MS优化到62MS

第k阶段状态的转移只依赖第k-1阶段的状态,可以用滚动数组(由于原来的空间本不大,所以代码中没有实现滚动数组)

 //#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int dp[][][], num[][], n; bool islegal(int x, int y)
{
return (x>= && x<=n && y>= && y<=n);
} int main(void)
{
#ifdef LOCAL
freopen("2686in.txt", "r", stdin);
#endif int i, j, k, d1, d2, x1, x2, y1, y2;
while(scanf("%d", &n) == )
{
memset(dp, , sizeof(dp));
for(i = ; i <= n; ++i)
for(j = ; j <= n; ++j)
scanf("%d", &num[i][j]); dp[][][] = num[][];
for(k = ; k <= *n-; ++k)
{
for(i = ; i <= k - ; ++i)
for(j = ; j <= i; ++j)
{//枚举两条路径在k-1步时的状态
for(d1 = ; d1 <= ; ++d1)
for(d2 = ; d2 <= ; ++d2)
{//共四个延伸方向
x1 = i + d1, y1 = k + - x1;
x2 = j + d2, y2 = k + - x2;
if(islegal(x1, y1) && islegal(x2, y2))
{
if(x1 == x2)
dp[k][x1][x2] = max(dp[k][x1][x2], dp[k-][i][j] + num[x1][y1]);
else
dp[k][x1][x2] = max(dp[k][x1][x2], dp[k-][i][j] + num[x1][y1] + num[x2][y2]);
}
}
}
}
printf("%d\n", dp[*n-][n][n]);
}
return ;
}

代码君

HDU 2686 (双线程) Matrix的更多相关文章

  1. HDU 2686 双进程DP

    //第一次遇到这种DP,看大牛的博客都是用最大流求解的...dp[k][i][j] 表示走k步,第一条路线横向走了i步,第二条路线横向走了j步,所获得的最大值.. //转移方程也很好想 #includ ...

  2. HDU 2686 Matrix 3376 Matrix Again(费用流)

    HDU 2686 Matrix 题目链接 3376 Matrix Again 题目链接 题意:这两题是一样的,仅仅是数据范围不一样,都是一个矩阵,从左上角走到右下角在从右下角走到左上角能得到最大价值 ...

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

    题目链接:http://acm.swust.edu.cn/problem/1084/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

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

    突发奇想,用双线程似乎可以优化一些暴力 比如说平面最近点对这个题目,把点复制成2份 一份按照x排序,一份按照y排序 然后双线程暴力处理,一份处理x,一份处理y 如果数据利用x递减来卡,那么由于双线程, ...

  5. 从微信小程序开发者工具源码看实现原理(三)- - 双线程通信

    文章概览: 引言 小程序开发者工具双线程通信的设计 1.on: 用来收集小程序开发者工具触发的事件回调 2.invoke:以api方式调用开发工具提供的基础能力 3.publish:用来向Appser ...

  6. 微信小程序之结构目录、视图层、双线程模型、生命周期、事件传递冒泡、组件、request、登录授权及支付

    结构目录与配置介绍 视图层与基础语法 双线程模型 生命周期 事件.传递和冒泡 组件.自定义组件.组件事件传递页面 Request.路由跳转.本地存储 登录(后端实现) | 授权(后端实现) 支付(后端 ...

  7. 微信小程序 - 双线程模型

    小程序的双线程模型 官方文档给出的双线程模型: 小程序的宿主环境 微信客户端提供双线程去执行wxml,wxss,js文件. 双线程模型 1.上述的渲染层上面运行着wxml文件,渲染层使用是的webvi ...

  8. 小程序的目录结构/配置介绍/视图层wxml数据绑定/双线程模型/小程序的启动流程

    安装好微信小程序开发软件,创建项目 小程序文件结构和传统web对比 结构 传统web 微信小程序 结构 HTML WXML 样式 CSS WXSS 逻辑 Javascript Javascript 配 ...

  9. Java学习之线程间通信(双线程)

    线程间通讯:多个线程在处理同一资源,但是任务不同 练习一:双线程出现线程安全问题,需要使用同步,思考同步代码添加位置需求:银行账户存钱,显示谁在账户存钱了,存了多少钱分析:操作同一银行账户两个不同的操 ...

随机推荐

  1. 几种基于HTTP协议的RPC性能比较

    有了整体的了解后,可以发现Hessian的这个远程过程调用,完全使用动态代理来实现的,其实从客户端代码不难看出,HessianProxyFactory的create方法就是创建接口Basic的代理类, ...

  2. 【面试题】Round A China New Grad Test 2014总结

    我也有够懒的,今天才跑来写总结,自觉面壁中… 上一篇是Practice Round,今天是Round A,五道题. 每次做完都想说,其实题不难..但在做的过程中总是会各种卡,只有自己一行一行实现了,才 ...

  3. 用VBS将PPT转为图片

    '使用方法:把ppt文件拖放到该文件上. '机器上要安装Powerpoint程序 On Error Resume Next Set ArgObj = WScript.Arguments pptfile ...

  4. photosop快速对白色背景图片进行抠图

    因为其中有个作业,做个图书馆的小网页.所以打算取图书馆logo上面那几个字. 图片如下: 因为是白色背景,一开始打算使用魔棒工具,不过效果不好. 后来百度了下,使用色彩范围可以快速抠图 打开photo ...

  5. iOS16进制设置颜色

    UIColor+Hex.h // // UIColor+Hex.h // 16进制颜色类别 // // Created by apple on 15-4-3. // Copyright (c) 201 ...

  6. POJ 1455

    /* 冒泡排序n*(n-1)/2; */ #include <iostream> using namespace std; int main() { //freopen("acm ...

  7. LINGO使用教程(一)

    LINGO是用来求解线性和非线性优化问题的简易工具.LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果. 1.LINGO快速入门 当你在 ...

  8. poj 3710 Christmas Game 博弈论

    思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点. 之后用博弈论的知识:某点的SG值等于子节点+1后的异或和. 代码如下: #include<iostream> #i ...

  9. easyUI Admin 模板

    http://www.oschina.net/p/Easy-Admin?fromerr=23Tfbale

  10. 【poj1061-青蛙的约会】拓展欧几里得-不定方程

    http://poj.org/problem?id=1061 题意:裸题.注意负数. //poj1061 #include<cstdio> #include<cstdlib> ...