HDU1081 (最大连续子序列/矩阵)

本文介绍了一个通过双重循环将二维矩阵转化为一维数组,并在此基础上寻找最大子段和的算法实现。该算法首先遍历二维矩阵的所有行组合,然后对每组行进行一维最大子段和计算,最终找到所有可能的最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将二维转化为一维。

第一个FOR循环用于枚举 行,第二个和第三个FOR 用于求从当前行(J)开始的每一个矩阵方块和,从而得到ANS。

View Code
 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn = 105;
 5 int a[ maxn ][ maxn ],temp[ maxn ];
 6 int n;
 7 
 8 int dp( ){
 9     int ans=temp[ 0 ];
10     int tmp_sum=0;
11     for( int i=0;i<n;i++ ){
12         tmp_sum+=temp[ i ];
13         if( ans<tmp_sum ) ans=tmp_sum;
14         if( tmp_sum<0 ) tmp_sum=0;
15     }
16     return ans;
17 }
18 
19 int main(){
20     while( scanf("%d",&n)!=EOF ){
21         for( int i=0;i<n;i++)
22             for( int j=0;j<n;j++ )
23                 scanf("%d",&a[ i ][ j ]);
24         int ans=-9999999;
25         for( int i=0;i<n;i++ ){
26             memset( temp,0,sizeof(temp) );
27             for( int j=i;j<n;j++ ){
28                 for( int k=0;k<n;k++ ){
29                     temp[ k ]+=a[ j ][ k ];
30                 }
31                 ans=max( ans,dp() );
32             }
33         }
34         printf("%d\n",ans);
35     }
36     return 0;
37 }

 

转载于:https://www.cnblogs.com/xxx0624/archive/2013/01/28/2880509.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值