poj解题报告——1050

来源:互联网 发布:简单的c语言程序文件 编辑:程序博客网 时间:2024/05/30 22:59

        在一维情况下最大连续子段和的求法是从左到有顺序扫描数据,以0为边界,当累加和小于0时则重置为0.动态规划的状态转移方程为s=max{si-1+ai,ai},该方程和前面的描述是等价的。本题是对一维最大子段和的扩展,思路是从上到下找出所有的连续行(如第i行到第j行),然后计算每列从第i行到第j行的和,之后对这n个列的和进行一维最大子段和的计算,并找出最大的值。

#include<stdio.h>#define MAX 101int main(){int n,i,j,k;int a[MAX][MAX]={0};int colsum[MAX][MAX]={0};int max=0,sum;scanf("%d",&n);for(i=0;i<n;i++)for(j=1;j<=n;j++){scanf("%d",&a[i][j-1]);colsum[i][j]=colsum[i][j-1]+a[i][j-1];}for(i=0;i<n;i++)for(j=i;j<=n;j++){sum=0;for(k=0;k<n;k++){sum+=colsum[k][j]-colsum[k][i];if(sum<0) sum=0;else if(sum>max) max=sum;}}printf("%d\n",max);return 0;}


0 0