$dp$。
要求选择$3$个区间,使得区间和最大。$dp[i][j]$表示前$i$个数中选择了$j$段获得的最大收益。
#include <cstdio> #include <cmath> #include <set> #include <cstring> #include <algorithm> using namespace std; int T,n,k; int dp[50010][5]; int a[50010]; int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); memset(dp,0,sizeof dp); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) a[i]=a[i]+a[i-1]; scanf("%d",&k); for(int i=1;i<=n;i++) { for(int j=1;j<=3;j++) { if(i-k>=0) dp[i][j] = max(dp[i-1][j] , dp[i-k][j-1]+a[i]-a[i-k]); } } printf("%d\n",dp[n][3]); } return 0; }
时间: 2024-10-05 06:44:17