题目大意:

在矩阵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的更多相关文章

  1. 【Luogu1345】周游加拿大(动态规划)

    [Luogu1345]周游加拿大(动态规划) 题面 题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直到你到达最东边 ...

  2. 洛谷 P2747 Canada Tour 周游加拿大 动态规划

    Description 你赢得了一场航空公司举办的比赛,奖品是一张加拿大机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直到你到达最东边的城市,再由东向西返回,直到你回到开始的城 ...

  3. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  4. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  5. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  6. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  7. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

  8. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

  9. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

随机推荐

  1. 从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件

    一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些许秘籍. 本文是介绍两个最常用的jQuery插件. 分别用 ...

  2. HDU5668 Circle 非互质中国剩余定理

    分析:考虑对给定的出圈序列进行一次模拟,对于出圈的人我们显然可以由位置,编号等关系得到一个同余方程 一圈做下来我们就得到了n个同余方程 对每个方程用扩展欧几里得求解,最后找到最小可行解就是答案. 当然 ...

  3. HDU4725 The Shortest Path in Nya Graph dij

    分析:对于每一层,原来n个点,然后扩展为原来的三倍,每一层扩展一个入点,一个出点,然后跑最短路 注:tmd我把一个n写成m了,然后wa了7次,我都要怀疑人生了 #include<cstdio&g ...

  4. java含多个包的命令行下执行

    C:\Users\liyang\Desktop\BAE\Baidu-BCS-SDK-Java-1.4.5>java -classpath(可以cp简写) bcs-sdk-java_1.4.5.j ...

  5. jdk 中Runtime之单例模式 学习

    这段代码是我从源码中截取的,大家很容易看到currentRuntime是一个静态变量,getRunTime对应的就是getInstacne.不是说这种方法不好吗? public class Runti ...

  6. 利用gdb 调试android jni c动态库

    http://blog.dornea.nu/2015/07/01/debugging-android-native-shared-libraries/ Since I haven't done thi ...

  7. redis的hash, list, set类型相关命令

    hash相关命令: 1. hset HSET key field value 将哈希表key中的域field的值设为value.如果key不存在,一个新的哈希表被创建并进行hset操作.如果域fiel ...

  8. ABAP SY标签一览 .

    Description: SY-SUBRC:语句执行后的返回值,0表示成功SY-DATUM:当前服务器日期SY-UZEIT:当前服务器时间SY-ULINE:255长度的水平线SY-VLINE:垂直线S ...

  9. CSS3最简洁的轮播图

    <!DOCTYPE html> <html> <head> <title>CSS3最简洁的轮播图</title> <style> ...

  10. Android_消息机制

    Android通过Looper.Handler来实现消息循环机制. Android的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环. Android系统中的Looper负责管理线程的消 ...