標籤:style blog http color io os ar for div
題意:把長度為n的序列分成k個m長的連續小序列,這些連續小序列的和最大是多少。
解法:顯然DP。
定義: dp[i][j] 為前 i 個元素分成j個m端,且 i 是第j個的末尾的最大和。
那麼有: dp[i][j] = max(dp[i-1][j], dp[i-m][j-1]+sum[i]-sum[i-m])
5000*5000的空間,是有點大。。
代碼:
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#define lll __int64using namespace std;lll dp[5002][5001];lll a[5002],sum[5003];int main(){ int n,m,k; int i,j; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { sum[0] = 0; for(i=1;i<=n;i++) { scanf("%I64d",&a[i]); sum[i] = sum[i-1]+a[i]; } for(i=0;i<=n;i++) for(j=0;j<=k;j++) dp[i][j] = 0; for(i=m;i<=n;i++) { dp[i][0] = max(dp[i][0],dp[i-1][0]); for(j=1;j<=k;j++) { dp[i][j] = max(dp[i][j],dp[i-1][j]); dp[i][j] = max(dp[i][j],dp[i-m][j-1]+sum[i]-sum[i-m]); } } cout<<dp[n][k]<<endl; } return 0;}View Code
Codeforces Round #267 Div2 C George and Job --DP