poj1050:http://poj.org/problem?id=1050

* maximum-subarray 问题的升级版本~

本题同样是采用DP思想来做,同时有个小技巧处理:就是把二维数组看做一维数组。怎么去看呢,我们可以吧具有同样列号的数捆绑到一起,比如 a[1][1], a[2][1], a[3][1]....。我们可以吧他们都看做 'a[1]'。因为最终的解是矩阵行数n中的任意一段,比如说:第p行到第q行, (1<=p<=q<=n), 我们要得到最终解,就一定要逐一枚举p,q。

* 如果p==q的话,就说明当前考察的矩阵只有一行,所以问题就很简单啦,在这一行上利用maximum-subarray DP解法就可以得到子矩阵a[p或者q][1...n]的最大和S1。

* 如果p!=q时,说明考察的巨狠是多行的,为了把多行变成‘一行‘,我们可以吧从p行到q行的矩阵同一列的值相加,比如:

第p行:       a[p][1],  a[p][2], .... ,  a[p][n]

第p+1行:a[p+1][1],  a[p+1][2], ... ,  a[p+1][n]

..........

第q行:     a[q][1],  a[q][2], ... ,  a[q][n]

相加---!> a[p][1]+...+a[q][1] , ... ,     a[p][n]+...+a[q][n]

这样我们在这个新的一维矩阵上又可以进行maximum-subarray DP解法,得到最大和S2。

并且每一次枚举p,q时得到的S1或者S2,我们都要和最终结果ans进行比较,将其中较大的值存入ans中。

细节看代码:

 1 #include<iostream>
2 #include<algorithm>
3 #include<cstdio>
4 #include<cstring>
5 using namespace std;
6 const int max_size=101;
7 const int inf=(1<<30);
8 int a[max_size][max_size];
9 int n;
10 int main(){
11 scanf("%d",&n);
12 memset(a,0,sizeof(a));
13 for(int i=1;i<=n;i++){
14 for(int j=1;j<=n;j++){
15 scanf("%d",&a[i][j]);
16 if(i>=2) a[i][j]+=a[i-1][j];
17 }
18 }
19 //int *tmp=new int[(n+1)*n][m+1];
20 int ans=-inf,sum;
21 for(int i=1;i<=n;i++){
22 //memset(tmp,0,sizeof(tmp));
23 for(int j=i;j<=n;j++){
24 if(j==i) sum=a[i][1];
25 else sum=a[j][1]-a[i-1][1];
26 for(int k=2;k<=n;k++){
27 if(j==i){
28 if(sum>0){
29 sum+=a[i][k];
30 }
31 else{
32 sum=a[i][k];
33 }
34 if(sum>ans) ans=sum;
35 }
36 else{
37 if(sum>0){
38 sum+=a[j][k]-a[i-1][k];
39 }
40 else{
41 sum=a[j][k]-a[i-1][k];
42 }
43 if(sum>ans) ans=sum;
44 }
45 }
46 }
47 }//end for
48 printf("%d\n",ans);
49 }

最新文章

  1. (转)也谈BIO | NIO | AIO (Java版)
  2. iOS 之 SVN提交错误:&quot;XXX&quot; is scheduled for addition, but is missing
  3. Effective Java 41 Use overloading judiciously
  4. 【转】javax.net.ssl.SSLHandshakeException(Cas导入证书)
  5. Android学习笔记(九)一个例子弄清Service与Activity通信
  6. JNI Java调用C代码 示例
  7. 图解Git命令
  8. ZigBee技术
  9. MSIL实用指南-创建枚举类型
  10. 如何理解Python装饰器
  11. EHDU-1039 asier Done Than Said?
  12. js中Array数组基本方法
  13. InvalidDataAccessResourceUsageException:mysql保留字引发的血案
  14. weixinShare.js / 极简微信分享插件
  15. TXLSReadWriteII5 单元格读写
  16. P2707 Facer帮父亲
  17. 修改Docker默认存储位置的方法
  18. Filter学习(一)
  19. 简易APB4 slave实践
  20. 转:微软分布式云计算框架Orleans

热门文章

  1. javascript高级编程笔记02(基本概念)
  2. makefile懒人版(单个文件编译)
  3. JavaScript函数调用
  4. SecureCRT+WinSCP 共用 key pub 密钥 转换 ppk 登录ssh
  5. [DP] The 0-1 knapsack problem
  6. 通过 SignalR 类库,实现 ASP.NET MVC 的实时通信
  7. ASP.NET Application,Session,Cookie和ViewState等对象用法和区别 (转)
  8. SpeedPHP多入口设置 前台和后台入口分开
  9. UVA 825 Walkiing on the safe side
  10. Linux设备驱动程序:中断处理之顶半部和底半部