foj2013 A short problem

Problem 2013 A short problem

Accept: 76    Submit: 206
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

The description of this problem is very short. Now give you a string(length N), and ask you the max sum of the substring which the length can't small than M.

 Input

The first line is one integer T(T≤20) indicates the number of the test cases. Then for every case, the first line is two integer N(1≤N≤1000000) and M(1≤M≤N).

Then one line contains N integer indicate the number. All the number is between -10000 and 10000.

 Output

Output one line with an integer.

 Sample Input

5 1 

1 -2 -2 -2 1 

5 2 

1 -2 -2 -2 1

 Sample Output

-1

 

福大月赛,表示难度适中, C和最后一题略难,没出。

最大子串和的加强版,只需要把 m个数看成一个数,并且再加个判断是否加了 m 个数就可以了。复杂度 O(n)

代码

 

#include <stdio.h> #include <string.h> #define INF -1000000002 int a[1000005]; int s[1000005]; int dp[1000005][2]; int Max(int x,int y) { return x>y?x:y; } int main() { int i,j,n,T,m,ans; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for (i=0;i<n;i++) { scanf("%d",&a[i]); if (i==0) s[i]=a[i]; else s[i]=s[i-1]+a[i]; dp[i][0]=dp[i][1]=-1000000002; } for (i=0;i<n;i++) { // printf("%d/n",dp[0][1]); if (i==0) { dp[0][0]=a[0]; if (m==1) dp[0][1]=a[0]; } else { dp[i][0]=Max(a[i],dp[i-1][0]+a[i]); if (i>=m-1) { if (i==m-1) dp[i][1]=s[i]; else dp[i][1]=Max(dp[i-m][0],0)+s[i]-s[i-m]; } } } ans=-1000000002; for (i=0;i<n;i++) { // printf("%d...%d...%d/n",i,dp[i][0],dp[i][1]); if (ans<dp[i][1]) ans=dp[i][1]; } printf("%d/n",ans); } return 0; }

你可能感兴趣的:(foj2013 A short problem)