【题意】
给定n、m、k
n个数a[i]
让你任选一个区间,使得最大。
【题解】
dp即可,设dp[i]为前i能得到的最大答案,由于m的范围比较小,只需要向前回溯m个寻找答案即可,每次区间和-k,那么r-l+1>=2就会自然的叠加了,类似01背包
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
ll a[N],dp[N],sum[N];
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;++i) {
cin>>a[i];
dp[i]=max(0ll,a[i]-k);
sum[i]=sum[i-1]+a[i];
}
ll ans=0;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(i-j>=0)
{
dp[i]=max(dp[i],dp[i-j]-k+sum[i]-sum[i-j]);
ans=max(ans,dp[i]);
}
}
}
//for(int i=1;i<=n;++i) printf("dp:%lld\n",dp[i]);
cout<<ans<<endl;
}
【题目】
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given an array a1,a2,…,ana1,a2,…,an and two integers mm and kk.
You can choose some subarray al,al+1,…,ar−1,aral,al+1,…,ar−1,ar.
The cost of subarray al,al+1,…,ar−1,aral,al+1,…,ar−1,ar is equal to ∑i=lrai−k⌈r−l+1m⌉∑i=lrai−k⌈r−l+1m⌉, where ⌈x⌉⌈x⌉ is the least integer greater than or equal to xx.
The cost of empty subarray is equal to zero.
For example, if m=3m=3, k=10k=10 and a=[2,−4,15,−3,4,8,3]a=[2,−4,15,−3,4,8,3], then the cost of some subarrays are:
- a3…a3:15−k⌈13⌉=15−10=5a3…a3:15−k⌈13⌉=15−10=5;
- a3…a4:(15−3)−k⌈23⌉=12−10=2a3…a4:(15−3)−k⌈23⌉=12−10=2;
- a3…a5:(15−3+4)−k⌈33⌉=16−10=6a3…a5:(15−3+4)−k⌈33⌉=16−10=6;
- a3…a6:(15−3+4+8)−k⌈43⌉=24−20=4a3…a6:(15−3+4+8)−k⌈43⌉=24−20=4;
- a3…a7:(15−3+4+8+3)−k⌈53⌉=27−20=7a3…a7:(15−3+4+8+3)−k⌈53⌉=27−20=7.
Your task is to find the maximum cost of some subarray (possibly empty) of array aa.
Input
The first line contains three integers nn, mm, and kk (1≤n≤3⋅105,1≤m≤10,1≤k≤1091≤n≤3⋅105,1≤m≤10,1≤k≤109).
The second line contains nn integers a1,a2,…,ana1,a2,…,an (−109≤ai≤109−109≤ai≤109).
Output
Print the maximum cost of some subarray of array aa.
Examples
input
Copy
7 3 10
2 -4 15 -3 4 8 3
output
Copy
7
input
Copy
5 2 1000
-13 -4 -9 -20 -11
output
Copy
0