题目:给出一个长度为n的数组,求不小于m长度的子数组里的和最大值
条件:1,长度不小m 2,求和的最大值
输入:T组数据(T≤20)
n(1≤n≤1000000) m(1≤m≤n).
输出:输出每个满足题意的和
思路:把长度为m的和的种类存在dp数组中,判断每个满足m长度的和加上后面的数与下一个满足m长度的和比较,取最大值。转移方程为dp[i]=max(dp[i],dp[i-1]+a[i]);
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int a[1000001],dp[1000001];
#define max(a,b) a>b?a:b
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d %d",&n,&m);
int i,j;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(i==0)
dp[i]=a[i];
else if(i<m)
dp[i]=dp[i-1]+a[i];
else
dp[i]=dp[i-1]+a[i]-a[i-m];//满足m长度的数组的和存入dp中
}
int max1=-10001;
for(i=m;i<n;i++)
{
dp[i]=max(dp[i],dp[i-1]+a[i]);
max1=max(max1,dp[i]);
}
printf("%d\n",max1);
}
return 0;
}
总结:1,最开始读题读错了,导致没有做出来