题目大意:
在n个数,求不重复的m段中的数据总和的最大值
令dp[i][j]表示将前j个数分成 i 段时得到的最大值(必取到第 j 个数)
状态转移可列为 dp[i][j]=Max(dp[i][j-1]+a[j] , Max( dp[i-1][k] ) + a[j] ) 0<k<j
1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 #include <iostream> 5 using namespace std; 6 7 const int N = 1000005; 8 int a[N] , dp[N] , ans[N]; 9 10 int main() 11 { 12 int n , m; 13 while(scanf("%d%d" , &m , &n) == 2) 14 { 15 memset(dp , 0 , sizeof(dp)); 16 memset(ans , 0 , sizeof(ans)); 17 for(int i=1 ; i<=n ; i++){ 18 scanf("%d" , a+i); 19 } 20 int maxn = -0x7fffffff; 21 for(int i=1 ; i<=m ; i++){ 22 maxn = -0x7fffffff; 23 for(int j=i ; j<=n ; j++){ 24 dp[j] = max(dp[j-1] + a[j] , ans[j-1] + a[j]); 25 ans[j-1] = maxn; 26 maxn = max(dp[j] , maxn); 27 } 28 } 29 printf("%d\n" , maxn); 30 } 31 return 0; 32 }
时间: 2024-10-11 00:43:13