HDU ACM 1081 To The Max->最大子矩阵
2016-02-08 11:40
405 查看
分析:利用求最大子段和的思想进行求解。
1、首先累加s[i][j]。表示第j列中i从第1行加到第i行的和。
2、对每一列的i1到i2行的和进行计算(0<i1<i2<=n),得出t[k],k表示列值。
3、对t[k]求最大字段和。
4、对全部t[k]求出的最大字段和求最大值,就可以得到最大子矩阵的和。
5、注意:对maxres=0;maxres|=1<<31;的解释。二进制最高位(符号位)置1,其它全部位置0,该数能够变为最小负数,前提为有符号数。
1、首先累加s[i][j]。表示第j列中i从第1行加到第i行的和。
2、对每一列的i1到i2行的和进行计算(0<i1<i2<=n),得出t[k],k表示列值。
3、对t[k]求最大字段和。
4、对全部t[k]求出的最大字段和求最大值,就可以得到最大子矩阵的和。
5、注意:对maxres=0;maxres|=1<<31;的解释。二进制最高位(符号位)置1,其它全部位置0,该数能够变为最小负数,前提为有符号数。
#include<iostream> using namespace std; int GetMaxNum(int a[],int n) //求最大字段和 { int i,sum=0,maxsum=0; maxsum|=1<<31; for(i=1;i<=n;i++) { sum+=a[i]; if(sum<a[i]) sum=a[i]; if(maxsum<sum) maxsum=sum; } return maxsum; } int main() { int n,i,j,k,a; int s[102][102],t[102]; int res,maxres; while(cin>>n) { for(i=0;i<=n;i++) //初始化。方便计算 s[i][0]=s[0][i]=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { cin>>a; s[i][j]=s[i-1][j]+a; //读入时就处理,累加每一列的和,s[i][j]表示第j列中i从第1行加到第i行的和 } maxres=0; maxres|=1<<31; //maxres二进制最高位(符号位)置1变为负数,变为最小负数 for(i=0;i<n;i++) for(j=i+1;j<=n;j++) { for(k=1;k<=n;k++) t[k]=s[j][k]-s[i][k]; //t[k]表示第k列中第i行到第j行的和 res=GetMaxNum(t,n); if(maxres<res) maxres=res; } cout<<maxres<<endl; } return 0; }
相关文章推荐
- 除夕夜
- 造轮子:论Top与ROW_NUMBER读取第一页的效率问题
- SQL变量与全局变量
- Java多线程编程总结 java 1.6版
- 使用Linux操作系统命令检查服务器主板上每个内存插槽的内存大小
- Codeforces Round #342 (Div. 2) A
- 安卓-APP安装后多个图标的解决
- Fragment生命周期
- Codeforces Round #342 (Div. 2) C. K-special Tables 构造
- 【翻译自mos文章】在使用Linux大页内存的配置中,使用drop_cache时导致的ORA-600 [KGHLKREM1]问题
- 查看4k对齐,激活.net framework 3.5
- nexus maven工厂配置
- 安卓-启动下一个Activity
- continue break return的区别
- Moore's majority vote algorithm
- View的工作原理 - Android开发艺术探索读书笔记(第四章)
- 文本绘制附加选项NSStringDrawingOptions的解释
- Codeforces Round #342 (Div. 2) B. War of the Corporations 贪心
- Twitter将推算法时间线
- Codeforces Round #342 (Div. 2) A - Guest From the Past 数学