poj 1050 To the Max && 51nod dp 最大子矩阵和
2016-05-14 16:28
363 查看
思路:
我们把每一列第i行到第j行之间的和求出来,形成一个数组c,于是一个第i行到第j行之间的最大子矩阵和对应于这个和数组c的最大子段和。然后每次求数组c的最大子串和,
ACcode:
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define maxn 700
#define ll long long
using namespace std;
int n,m;
ll dp[maxn][maxn];
ll c[maxn];
ll ans=0,tmp;
int main(){
while(~scanf("%d",&n)){
m=n;
for(int i=1;i<=m;++i)for(int j=1;j<=n;++j)scanf("%I64d",&dp[i][j]);
memset(c,0,sizeof(c));
for(int i=1;i<=m;++i)
for(int j=i;j<=m;++j)
for(int k=1,tmp=0;k<=n;++k){
c[k]=(j==i)?dp[i][k]:c[k]+dp[j][k];
if(tmp>0)tmp+=c[k];
else tmp=c[k];
ans=ans>tmp?ans:tmp;
}
printf("%I64d\n",ans);
}
return 0;
}
/*
1
3 6 7
1 7 5 4 8 3 9
1 4 3 5 6 2 8 9
*/
我们把每一列第i行到第j行之间的和求出来,形成一个数组c,于是一个第i行到第j行之间的最大子矩阵和对应于这个和数组c的最大子段和。然后每次求数组c的最大子串和,
ACcode:
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define maxn 700
#define ll long long
using namespace std;
int n,m;
ll dp[maxn][maxn];
ll c[maxn];
ll ans=0,tmp;
int main(){
while(~scanf("%d",&n)){
m=n;
for(int i=1;i<=m;++i)for(int j=1;j<=n;++j)scanf("%I64d",&dp[i][j]);
memset(c,0,sizeof(c));
for(int i=1;i<=m;++i)
for(int j=i;j<=m;++j)
for(int k=1,tmp=0;k<=n;++k){
c[k]=(j==i)?dp[i][k]:c[k]+dp[j][k];
if(tmp>0)tmp+=c[k];
else tmp=c[k];
ans=ans>tmp?ans:tmp;
}
printf("%I64d\n",ans);
}
return 0;
}
/*
1
3 6 7
1 7 5 4 8 3 9
1 4 3 5 6 2 8 9
*/
相关文章推荐
- 蓝桥杯练习题 BASIC-27 2n皇后问题(八皇后问题 搜索)
- c语言编写猜数字游戏
- 系统架构师成长之路(四)
- C#调用java代码(IKVMC)
- pos机中如何给一个对象赋一个新的属性并存到一个新数组
- Css技术入门笔记01
- Css技术入门笔记01
- 【转】Android 防破解技术简介
- 根目录 上级目录 当前目录
- 【Linux】Shell三类变量的作用域——linux shell “永久环境变量”、“临时环境变量”和"普通变量"之完全解读
- Property Animation(属性动画)
- 磁盘排序算法(多路归并、位图)
- 浅谈HashSet和TreeSet区别及用法(附源码)
- github代码上传(初学)
- (经典)POJ-3181 完全背包+大数处理
- 人为删除控制文件故障模拟
- 圆柱
- 亚马逊 在线笔试 2014-10-9 比较扑克牌序列
- 栈
- thinkphp3.2,URL重写