标签:poj style while clu min printf log 个数 can
$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; }
标签:poj style while clu min printf log 个数 can
原文地址:http://www.cnblogs.com/zufezzt/p/6817947.html