//最大m字段和问题 // 设b[I,J]表示前j项的i个字段和的最大值 //b[i,j] = max{b[i,j-1],b[i-1,j-1]+a[j]} #include<iostream> using namespace std; int a[100001]; int solve(int m,int n); int main() { int m,n; while(cin >> n >> m) { for(int i=1; i<=n; i++) cin >> a[i]; int ans = solve(m,n); cout << ans << endl; } return 0; } int solve(int m,int n) { if(n<m || m < 1) return 0; int max = 0; int *b = new int[n+1]; int *c = new int[n+1]; b[0] = 0; c[1] = 0; for(int i=1; i<=m; i++) { b[i] = b[i-1] + a[i]; c[i-1] = b[i]; max = b[i]; for(int j=i+1; j<=i+n-m; j++) { b[j] = b[j-1] > c[j-1] ? b[j-1] + a[j] : c[j-1] + a[j]; c[j-1] = max; if(max < b[j]) max = b[j]; } c[i+n-m] = max; } for(int j=m; j<=n; j++) { if(max < b[j]) max = b[j]; } return max; } /* int solve(int m,int n) { int i,j; for(i=1;i<=m;i++) { for(k=1;k<=m;k++) { //动态规划b[i,j] = max{b[i,j-1],b[i-1,j-1]+a[j]} for(j=1;j<=n;j++) { if(b[i][j-1]>b[i-1][j-1]+a[j]) b[i][j] = b[i][j-1]; else b[i][j] = b[i-1][j-1]+a[j]; //b[i][j] = max(b[i][j-1],b[i-1][j-1]+a[j]); } } } return b[m][n]; }*/