首先还是对题目的意思进行说明,给出一个矩阵的数,然后求出一个子矩阵这个子矩阵包含的数的和是最大的。

首先对于题目进行转化,利用一个数组add进行存放临时数据,第一行存放原来数据的第一行,第二行存放原来数据的一二行的和,第三行存放原来数据的一二三行的和。

利用这个数组可以把任何连续几行的数据变成一行的数据,然后对于一行的数据进行求最大来求出原矩阵和的最大。

对于一行数据我们就可以进行dp了。

动态方程(这里就不是转移方程了,他没有状态的转化)

if(row_max > 0)
                    row_max += now;
                else
                    row_max = now;

if(row_max > result)
                    result = row_max;

什么意思呢?解释一下,一旦当前是负数,那么一定是不能往上加的,因为加的那个数无论是正的还是负的,都变加的那个数小,还不如直接用那个数开始呢。如果是正数,那么老老实实往上加对了,反正是要求是连续的,加了这个也不一定会更新最大值,加了这个再加下一个就有可能更新最大值了。

初始值0就不多说了,反正肯定会更新的。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm> using namespace std;
/*dp,poj1050*/ int maps[][];//记录用户输入数据
int add[][];//记录1行到当前行的和 /*
利用add数组可以求出任意两行同一列下连续的和
123
456
789
如:求2-3行的和,为add[3][0]-add[1][0]
注意add保存的是原始数据求和之后的值
add[3][0]=map[3][0]+map[2][0]+map[1][0];
*/ int main()
{
int n;//用户输入变量
int i,j,k;//循环变量
int result;//结果
int now;//当前值
int row_max;//当前行最大值 cin>>n;
result = -;//初始化
for (i = ; i <= n; i++)
{
for (j = ; j <= n; j++)
{
cin>>maps[i][j];
add[i][j] = maps[i][j] + add[i-][j]; //生成add
}
} for (i = ; i <= n; i++)
{
for (k = i; k <= n; k++)
{
row_max = ;
for (j = ; j <= n; j++)
{
//计算从i行到k行的和
now = add[k][j] - add[i-][j]; //下面三句是dp重点,如果看不懂先记住再说
if(row_max > )
row_max += now;
else
row_max = now; if(row_max > result)
result = row_max;
}
}
}
cout<<result<<endl; return ;
}

动态规划3-------poj1050的更多相关文章

  1. OJ题目分类

    POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...

  2. poj1050 dp动态规划

    Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...

  3. DP----入门的一些题目(POJ1088 POJ1163 POJ1050)

    动态规划入门 DP 基本思想 具体实现 经典题目 POJ1088 POJ1163 POJ1050 (一) POJ1088,动态规划的入门级题目.嘿嘿,连题目描述都是难得一见的中文. 题目分析: 求最长 ...

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

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

  5. 简单动态规划-LeetCode198

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

  6. 动态规划 Dynamic Programming

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

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

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

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

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

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

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

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

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

随机推荐

  1. HTML 概述

    一.hello world<!--根标签--><html> <!--头部--> <head> <!--标题标签--> <title&g ...

  2. php获取当前域名

    当前url:http://localhost:805/test/helloworld.php echo 'SERVER_NAME:'.$_SERVER['SERVER_NAME']; //获取当前域名 ...

  3. 二、oracle sql*plus常用命令

    一.sys用户和system用户Oracle安装会自动的生成sys用户和system用户(1).sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户 ...

  4. List循环与Map循环的总结

    做了一下list和map的总结,没有什么技术含量,就全当复习了一下api. 测试环境是在junit4下,如果没有自己写一个main方法也是一样的. 首先是List的三种循环: @Test public ...

  5. iOS特殊字符的转义字符

    所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为 ...

  6. 笔记整理--Linux多线程

    Unix高级环境编程系列笔记 (2013/11/17 14:26:38) Unix高级环境编程系列笔记 出处信息 通过这篇文字,您将能够解答如下问题: 如何来标识一个线程? 如何创建一个新线程? 如何 ...

  7. win7下将dll文件的打开方式改回系统默认

    打开注册表,定位到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dll把除OpenWit ...

  8. Windows server 2008搭建php运行环境

    下载php组件包 首先到http://windows.php.net/download/下载你需要的php版本,这里我下载的是php5.3. 下面解压php组件 包到磁盘上. 安装Microsoft ...

  9. Away 3d 框架

    卷 工作资料 的文件夹 PATH 列表 卷序列号为 00000200 F8B8:EE5E E:. │  tree.txt │  tree1.txt │   ├─away3d │  │  .DS_Sto ...

  10. ecshop 去版权

    与官网通信的几个地方: 1,打开admin/templates/index.htm,查找并删除 <frameset rows="0, 0" framespacing=&quo ...