POJ-1050-To the Max-dp
2015-11-10 15:55
351 查看
http://poj.org/problem?id=1050
给100*100的矩阵 元素是任意整数
求一个子矩阵,使得其元素和最大
思路:
假设最优子矩阵的上下边界是 第i行和第j行,
那么我们只需要 把 从第i行 到第j行的元素累加起来,生成一个一维数组
然后对一维数组求个最大连续区间和就ok; O(n)
所以我们只需要枚举 i 和j O(n^2)
复杂度 O(n^3)
累加部分可以直接用前缀和预处理。。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
int n;
int i,j;
int k,h;
int max(int a,int b)
{return a<b?b:a;}
int tm[105][105];
int tmp[105];
int main()
{
int zero=0;
scanf("%d",&n);
int mark=-129;
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
scanf("%d",&tm[i][j]);
if (tm[i][j]>mark)
mark=tm[i][j];
if (!tm[i][j])
zero=1;
}
}
int maxx=0;
for (i=1;i<=n;i++) //以第i行为头
{
memset(tmp,0,sizeof(tmp));
for (j=i;j<=n;j++)
{
for (k=1;k<=n;k++) //把i到n行都累加起来 看作一行
{
tmp[k]+=tm[j][k];
}
int sum=0; //trick? max<0
for (k=1;k<=n;k++) //对一行求dp_max
{
if (sum+tmp[k]<0)
sum=0;
else
sum+=tmp[k];
if (sum>maxx)
maxx=sum;
}
if (sum>maxx)
maxx=sum;
}
}
if (maxx==0&&!zero) //全为负数输出最大的负数
maxx=mark;
printf("%d\n",maxx);
return 0;
}
给100*100的矩阵 元素是任意整数
求一个子矩阵,使得其元素和最大
思路:
假设最优子矩阵的上下边界是 第i行和第j行,
那么我们只需要 把 从第i行 到第j行的元素累加起来,生成一个一维数组
然后对一维数组求个最大连续区间和就ok; O(n)
所以我们只需要枚举 i 和j O(n^2)
复杂度 O(n^3)
累加部分可以直接用前缀和预处理。。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
int n;
int i,j;
int k,h;
int max(int a,int b)
{return a<b?b:a;}
int tm[105][105];
int tmp[105];
int main()
{
int zero=0;
scanf("%d",&n);
int mark=-129;
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
scanf("%d",&tm[i][j]);
if (tm[i][j]>mark)
mark=tm[i][j];
if (!tm[i][j])
zero=1;
}
}
int maxx=0;
for (i=1;i<=n;i++) //以第i行为头
{
memset(tmp,0,sizeof(tmp));
for (j=i;j<=n;j++)
{
for (k=1;k<=n;k++) //把i到n行都累加起来 看作一行
{
tmp[k]+=tm[j][k];
}
int sum=0; //trick? max<0
for (k=1;k<=n;k++) //对一行求dp_max
{
if (sum+tmp[k]<0)
sum=0;
else
sum+=tmp[k];
if (sum>maxx)
maxx=sum;
}
if (sum>maxx)
maxx=sum;
}
}
if (maxx==0&&!zero) //全为负数输出最大的负数
maxx=mark;
printf("%d\n",maxx);
return 0;
}
相关文章推荐
- 第23讲 项目1:被3或者5整除的数
- HDU 1022 Train Problem I
- iOS 环信集成(六) 退出登陆
- Android 中okHttp的cookie
- mysql 字符集
- c++(数据选择)
- Cglib类代理工厂
- Liferay Portal 学习笔记(一),介绍
- Matlab计算机视觉/图像处理工具箱推荐
- android语音识别技术
- LINUX mysql 源码安装
- c++(基数排序)
- Codeforces Round #328 (Div. 2)D. Super M 虚树直径
- WTO框架下经济结构调整和产业升级
- ant 使用指南
- 【iOS学习笔记 15-11-10】Objective-C中根据函数名调用函数
- 字符串和数组之间的装换
- ant 使用指南
- SQL中Group By, Having, Where, Order by几个语句的执行顺序
- 1 nrf51822简介