poj To the Max (动态规划)

题目意思:

给出一个矩阵。求出和最大的子矩阵,在解决这个问题的之前,首先看一下这个问题的一维问题,给出一个序列求最大子序列。满足i<=i<=j<=n 求出最大的i-->j的和。

题目分析:

对于一维问题,有很多的解决方法,当然也对应不同的时间和空间复杂度。有暴力,优化暴力,贪心,动态规划等解法,由于这里此题的二维问题要用到动态规划,这里只给出动态规划算法。对于二维问题只需要转化为一维的问题,在用动态规划方法解决问题。

一维动归:

int ToMax(int a[],int n){

int s[10000]={0};

for(int i=1;i<=n;i++){

if(s[i-1]>=0) s[i]=s[i-1]+a[i];

else s[i]=a[i];

}

int ma=-10000000;

for(int i=1;i<=n;i++){

if(s[i]<ma) ma=s[i];

}

return ma;

}

二维AC代码:

#include<iostream>

#include<cstring>

using namespace std;

int a[105][105],sum[105],b[105];

int main()

{

int n;

while(cin>>n){

for(int i=1;i<=n;i++){

for(int j=1;j<=n;j++){

cin>>a[i][j];

}

}

memset(sum,0,sizeof(sum));

int max=-100000;

for(int i=1;i<=n;i++){

memset(sum,0,sizeof(sum));

memset(b,0,sizeof(b));

for(int k=i;k<=n;k++){

for(int j=1;j<=n;j++){

b[j]+=a[k][j];

if(sum[j-1]>=0){

sum[j]=sum[j-1]+b[j];

}

else sum[j]=b[j];

if(max<sum[j]) max=sum[j];

}

}

}

cout<<max<<endl;

}

return 0;

}

时间: 2024-11-17 15:56:51

poj To the Max (动态规划)的相关文章

[ACM] POJ 2479 Maximum sum (动态规划求不相交的两段子段和的最大值)

Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33363   Accepted: 10330 Description Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: Your task is to calculate d(A). Input The input consists o

POJ 3071 Football (动态规划-概率DP)

Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2768   Accepted: 1412 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all teams still in the

poj 1163 The Triangle (动态规划)

The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37778   Accepted: 22685 Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed

[POJ 3211] Washing Clothes (动态规划)

题目链接:http://poj.org/problem?id=3211 题意:有M件衣服,每种衣服有一种颜色,一共有N种颜色.现在两个人洗衣服,规则是必须把这一种颜色的衣服全部洗完才能去洗下一种颜色的衣服. 问:在两个人可以同时洗衣服的情况下,把衣服全部洗完最少需要多久. 如果说两个人同时洗同一种颜色衣服,那么最少的时间就是洗完该颜色衣服的总时间的一半. 那么我们可以将洗每种衣服分开来看,视作一个01背包,容量是洗该颜色衣服的总时间的一半. 然后最多花多久.那么该颜色的总时间-这个人花的最多时间

POJ 3616 Milking Time 动态规划

http://poj.org/problem?id=3616 题意:一个奶牛在0~N时间段内可被取奶,每次挤奶以后必须休息至少R分钟才能下次继续挤奶.有M次可以挤奶的时间段,每次取奶对应三个值:开始时间.结束时间.效率值,每次挤奶的过程不能中断.求出最大效率值. 解法:首先按照结束时间从小到大排序(按照结束时间排序方便后边的dp):dp[i]表示第i个挤奶时间段后,效率最大值. 转移方程如下: 初始化:dp[i] = data[i].eff #include <iostream> #inclu

POJ 3046 Ant Counting(“动态规划” 优化递推关系式)

http://poj.org/problem?id=3046 蚂蚁牙黑,蚂蚁牙红:有A只蚂蚁,来自T个家族.同一个家族的蚂蚁长得一样,但是不同家族的蚂蚁牙齿颜色不同.任取n只蚂蚁(S<=n<=B),求能组成几种集合? 这是<2.3 记录结果再利用的"动态规划" 优化递推关系式>练习题的第二题. 定义 dp[i][j] := 使用前i个家族可以配出来"元素个数为j"的集合的个数. 那么dp[0][0] = 1,不使用任何蚂蚁配出空集的个数为1.

POJ - 1125 Stockbroker Grapevine (动态规划理解floyd)

题目大意:有一个,想要在最短的时间內将一个谣言散发给所有人,但是他只能将这个谣言告诉给一个人,然后通过这个人传播出去.问,他应该告诉哪个人,让所有人都听到这个谣言的最短时间是多少 解题思路:这题很容易想到用floyd求出每个点之间的最短路. 做这题时,已经很久没做最短路的了,所以一时写不出floyd.发现自己太依赖模版了,所以在这里想写一下自己对floyd的理解(借鉴了这里写链接内容)好让自己下次不看模版也能想出来 设dp[i][j]为i到j的最短路,因为floyd有三成for,写起来的时候也知

POJ 1050 二维动态规划转变成枚举加一维的动态规划!

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <climits> #include <cstring> #include <cmath> #include <map> #include <set> using namespace s

poj 3635 Full Tank 动态规划思想在spfa算法中的应用

题意: 有n个城市,和m条已知长度的路,在路上走1单位距离要花1单位油,每个城市都可以加油且有各自的油价,现在任给两个城市s,t,要求从s到t最少花多少油. 思路: 网上大多数都是拿优先队列做的,拿spfa做更有意思,但一般的spfa会超时.dis[i][j]表示到城市i时油箱里有j单位油时的最小花费.对于城市x,y,他们的距离为w,如果存在dis[x][j]<dis[y][i-w],则确定对y进行更新,注意如果对每个dis[x][j]<dis[y][j-w],dis[x][j+1]<d