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

首先对于题目进行转化,利用一个数组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. RegOpenKey(注册表定位器) 1.5 中文免费绿色版

    软件名称: RegOpenKey(注册表定位器) 1.5 中文免费绿色版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP / Wi ...

  2. eclipse设置java虚拟机内存大小

    设置java虚拟机大小可以让eclipse启动运行更快...... 在eclipse中点击window--preferences--java--Installed JREs. 然后看右边的框,鼠标点击 ...

  3. android 编译的原理介绍

    http://blog.csdn.net/mr_raptor/article/details/7540066

  4. [PHP] 安装和配置

    Apachehttpd-2.2.19-win64mysql5.6Phphttp://www.php.net/downloads.php 5.4Phpeclipsehttp://www.phpeclip ...

  5. gridControl 中CellValueChanged,ShowingEditor,CustomDrawCell的用法

    private void gridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventA ...

  6. POJ 2246 Matrix Chain Multiplication

    用栈来处理一下就好了. #include<iostream> #include<algorithm> #include<cstdio> #include<cs ...

  7. How to set a MySQL root user password in MAC OSX

    https://www.youtube.com/watch?v=sFT9tGL54sI

  8. linux设置时间服务器

    对多个linux服务器,时间保持一致是很必要的.根据精确度要求,应该有相应的时间间隔进行时间同步.如果不进行时间同步,时间久了就会差别很大,遇到问题时定位就很困难.因为多台设备的配合,log之间可能有 ...

  9. Angularjs Directive(指令)机制

    转:http://damoqiongqiu.iteye.com/blog/1917971 1.一点小说明 指令的作用:实现语义化标签 我们常用的HTML标签是这样的: <div> < ...

  10. C# 系统应用之清除Cookies、IE临时文件、历史记录 转载

    http://blog.csdn.net/Eastmount/article/details/18821221 本文主要是项目"个人电脑使用记录清除软件"系类文章中关于清除浏览器C ...