例如一位数组 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;
}
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 42952 | Accepted: 22793 |
Description
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
Output
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;
}