dp求最大子段(一维数组,二维数组)

例如一位数组  ss[]={12,-4,-6,2,-4,8,-6,11,-3}  求子串最大值  

非常简单的dp

#include <stdio.h>

#include "string.h"

int main()

{

   int ss[]={12,-4,-6,2,-4,8,-6,11,-3},dp[9],max=0;

   memset(dp,0,sizeof(dp));

    dp[0]=ss[0];

   for(int i=1;i<9;i++)

    {

        dp[i]=dp[i-1]>0?dp[i-1]+ss[i]:ss[i];

        max=dp[i]>max?dp[i]:max;

    }

   printf("%d",max);

    return 0;

}


二维数组的最大子段  poj 1050  

To the Max
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 42952 Accepted: 22793

Description

Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle. 
As an example, the maximal sub-rectangle of the array: 

0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 
is in the lower left corner: 

9 2 
-4 1 
-1 8 
and has a sum of 15. 

Input

The input consists of an N * N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N^2 integers separated by whitespace (spaces and newlines). These are the N^2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].

Output

Output the sum of the maximal sub-rectangle.

Sample Input

4
0 -2 -7 0 9 2 -6 2
-4 1 -4  1 -1

8  0 -2

Sample Output

15

下午新生赛狂TLE,WA 果然自己太菜 没想到用DP 思路是结束看别人解题报告的 

二维数组纵向横向都是线性的 

例如以下数组:

1  s11 s12 s13 s14

2  s21 s22 s23 s23

3  s31 s32 s33 s34

 先求出第1行的最大子串  若求第1行和第2行的子串 只需求(s11+s21,s12+s22,s13+s23,s14+s24)的最大子串 

 所以对于以上数组只需求 1,1+2,1+2+3,2,2+3,3的最大子串比较取max即可

#include <stdio.h>

#include "string.h"

int main()

{

   int n,ss[101][101],max=0,dp[101],temp[101];

   scanf("%d",&n);

   for(int i=0;i<n;i++)

       for(int j=0;j<n;j++)

           scanf("%d",&ss[i][j]);

   for(int i=0;i<n;i++)

    {

       memset(temp, 0,sizeof(temp));

       for(int j=i;j<n;j++)

        {

           for(int k=0;k<n;k++)

                temp[k]+=ss[j][k];

            dp[0]=temp[0];

           for(int j=1;j<n;j++)

            {

                dp[j]=dp[j-1]>0?dp[j-1]+temp[j]:temp[j];

                max=max>dp[j]?max:dp[j];

            }

        }

    }

   printf("%d\n",max);

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值