双程动态规划 nyoj61
题目大意:
在矩阵m*n中,从(1,1)点到(m,n)点,再从(m,n)点到(1,1)点,所走路线经过的同学最大好心值, 要求每个点只能走一遍。
分析:
①我们可以把它只看成两个人同时从(1,1)点, 走到(m,n)点。
②因为只可以往两个方向走所以无论什么了路线,从(1,1)到(m,n)所走的步数一定相同。开四维数组存状态的话f[x1][y1][x2][y2]](表示当前一个人走在(x1,y1)一人走在(x2,y2))那么意思也就是x1+y1 = x2+y2。
③此题中开四维数组太大,会超时。又知道同一时间所走的步数相同。那么我们可以设一个三维数组f[i][x1][x2]: i代表第i步(或者i时刻),第一个人在x1行,第二个人在x2行时,所经过的同学最大好心值。 细心地应该发现:一共走的步数已知,向下走的步数(也就是x1, x2)已知,那么向右走的步数也能知道啦 y1= i - x1; y2 = i - x2; 其实f[i][x1][x2]已经暗示了两个人所在的位置(x1, i-x1),(x2, i-x2),所代表的和四维数组f[x1][y1][x2][y2]一样。
额。。。说了这么多,不知明白没有。好了来代码吧! 还要注意的是:我的数组是从(1,1)开始的。 如果从(0,0)开始只要稍微改一下边界就行。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
using namespace std; int t, m, n, a[][], f[][][];
int max1(int a, int b, int c, int d)
{
a = max(a, b);
c = max(c, d);
a = max(a, c);
return a;
}
void dp()
{
for(int i = ; i < m+n; i++)
{
for(int x1 = ; x1 <= n && x1 <= i-; x1++)
{
for(int x2 = ; x2 < n && x2 < i-; x2++)
{
int y1 = i - x1;
int y2 = i - x2;
if(y1 == y2) continue;//如果y1, y2不同那么x1,x2一定也不同。那么两个人就不会走相同的点了
f[i][x1][x2] = max1(f[i-][x1][x2], f[i-][x1][x2-], f[i-][x1-][x2],
f[i-][x1-][x2-])+a[x1][y1]+a[x2][y2];
}
}
}
}
int main()
{
cin >> t;
while(t--)
{
memset(a, , sizeof(a));
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
scanf("%d", &a[i][j]);
memset(f, , sizeof(f));
dp();
printf("%d\n", f[m+n-][n][n-]);
}
return ;
}
双程动态规划 nyoj61的更多相关文章
- 【Luogu1345】周游加拿大(动态规划)
[Luogu1345]周游加拿大(动态规划) 题面 题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直到你到达最东边 ...
- 洛谷 P2747 Canada Tour 周游加拿大 动态规划
Description 你赢得了一场航空公司举办的比赛,奖品是一张加拿大机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直到你到达最东边的城市,再由东向西返回,直到你回到开始的城 ...
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- C#动态规划查找两个字符串最大子串
//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
随机推荐
- Ubuntu下配置Scheme开发环境
MIT-Scheme环境 http://www.gnu.org/software/mit-scheme/ 在官网下载安装包,编译安装即可,期间会提示找不到m4这个库,安装即可 Scheme自带的交互环 ...
- UVA 1351 - String Compression
题意: 对于一个字符串中的重复部分可以进行缩写,例如"gogogo"可以写成"3(go)",从6个字符变成5个字符.."nowletsgogogole ...
- [Jacky] 解决Ext.Net GridPanel 选择的行数据刷新后不能获取最新值
选择GridPanel中一行数据,当变更数据时并重新刷新之后不能获取最新值,需通过如下方式获取: var internalId = gridPanel.getSelectionModel().getL ...
- Frank自动化测试
记得是夏天的时候去参加一个infoQ的论坛,里面有一个朋友强烈推荐Frank测试框架.所以趁着年底赶紧学一下.这中间需要ruby的基础. 安装过程:1.安装frank-cucumber 命令: sud ...
- 【转】Django+Mysql安装配置详解(Linux)
参考:http://dmyz.org/archives/110 报错TemplateDoesNotExist at 解决: 新建mysite/articles/article.html文件: 文件内容 ...
- Mac OS X Mountain Lion安装Bochs
基本步骤可以看这个帖子 http://hi.baidu.com/any_where/item/990c0acdfbd6542c47d5c003 大体是: 1.安装x11; 2.开启Mac OS X的r ...
- Esper系列(二)时间窗口、长度窗口、cast、注解、自定义函数、静态方法
长度窗口实现原理图 说明: 上图长度窗口为5,事件W1至W5进入引擎后属于NewEvents队列,事件W6进入引擎后,W2至W6就属于NewEvents队列,而事件W1就属于OldEvents队列了. ...
- linux定时器HZ和Jiffies
1.linux HZ Linux核心几个重要跟时间有关的名词或变数,以下将介绍HZ.tick与jiffies. HZ Linux核心每隔固定周期会发出timer interrupt (IRQ 0),H ...
- CM5(Cloudera Manager 5) + CDH5(Cloudera's Distribution Including Apache Hadoop 5)的安装详细文档
参考 :http://www.aboutyun.com/thread-9219-1-1.html Cloudera Manager5及CDH5在线(cloudera-manager-installer ...
- Git简介:
Git中文文档 1.详解在Visual Studio中使用git版本系统(图文) 2.GitExtensions下载地址:http://gitextensions.codeplex.com/ 3.Gi ...