HDU 1024Max Sum Plus Plus(最大m字段和)

 /*     动态转移方程:dp[i][j]=max(dp[i-1]+a[i], max(dp[t][j-1])+a[i]) (j-1<=t<i)     表示的是前i个数j个字段和的最大值是多少! */ 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define N 10000
 5 using namespace std;
 6
 7 int dp[N][N], num[N];
 8
 9 int main()
10 {
11    int n, m, i, j, k;
12    while(scanf("%d%d", &m, &n)!=EOF)
13    {
14       for(i=1; i<=n; i++)
15         scanf("%d", &num[i]);
16       memset(dp, 0, sizeof(dp));
17       for(j=1; j<=m; j++)
18          for(i=j; i<=n-m+j; i++)
19            if(i>j)
20             {
21                 dp[i][j]=dp[i-1][j]+num[i];
22                 for(k=j-1; k<i; k++)//可以用一个Max变量一直更新 j-1 到 i-1 的 最大值
23                    dp[i][j]=max(dp[i][j], dp[k][j-1]+num[i]);
24             }
25             else dp[i][j]=dp[i-1][j-1]+num[i];
26       int sum=-1;
27       for(i=m; i<=n; i++)
28          if(dp[i][m]>sum)
29             sum=dp[i][m];
30       printf("%d\n", sum) ;
31    }
32    return 0;
33 }
/*
时间上优化一下!
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define N  1000010
using namespace std;

__int64 dp[N][2], num[N];

int main()
{
   __int64 n, m, i, j, k, pos;
   while(scanf("%I64d%I64d", &m, &n)!=EOF)
   {
      for(i=1; i<=n; i++)
        {
           scanf("%I64d", &num[i]);
           dp[i][0]=dp[i][1]=0;
        }
      pos=1;
      for(j=1; j<=m; j++)
         {
            dp[j][pos]=dp[j-1][pos^1]+num[j];
            __int64 Max=dp[j-1][pos^1];
            for(i=j+1; i<=n-m+j; i++)
             {
                 Max=max(Max, dp[i-1][pos^1]);//这一块直接将 k 的 for循环去掉
                 dp[i][pos]=max(dp[i-1][pos], Max)+num[i];
              }
            pos^=1;
         }
      pos^=1;
      __int64 sum=-99999999;
      for(i=m; i<=n; i++)
         if(dp[i][pos]>sum)
            sum=dp[i][pos];
      printf("%I64d\n", sum) ;
   }
   return 0;
}
 1 /*
 2   内存上优化一下,一维数组求解!
 3 */
 4 #include<iostream>
 5 #include<cstdio>
 6 #include<cstring>
 7 #define N  1000010
 8 using namespace std;
 9
10 __int64 dp[N], num[N];
11
12 int main()
13 {
14    __int64 n, m, i, j, k, oldN;
15    __int64 maxN;//记录dp[k][j-1] (k>=j-1 && k<i) 只有num[i]自己属于第 j 段 所有情况的最大值!
16    while(scanf("%I64d%I64d", &m, &n)!=EOF)
17    {
18       for(i=1; i<=n; i++){
19            scanf("%I64d", &num[i]);
20            dp[i]=0;
21        }
22       for(j=1; j<=m; j++)
23          {
24             maxN=max(dp[j-1], dp[j]);// Max = max(dp[j-1][pos^1], dp[j][pos^1])
25             dp[j]=dp[j-1]+num[j];
26             for(i=j+1; i<=n-m+j; i++)
27              {
28                  oldN=dp[i];// 记录 dp[i-1][pos^1]
29          dp[i]=max(maxN, dp[i-1])+num[i]  ;// dp[j][pos] = dp[j-1][pos^1] + num[j]
30          maxN=max(oldN, maxN);
31              }
32          }
33       __int64 sum=-99999999;
34       for(i=m; i<=n; ++i)
35          if(dp[i]>sum)
36             sum=dp[i];
37       printf("%I64d\n", sum) ;
38    }
39    return 0;
40 } 


HDU 1024Max Sum Plus Plus(最大m字段和)

时间: 2024-10-06 02:21:47

HDU 1024Max Sum Plus Plus(最大m字段和)的相关文章

hdu 1258 Sum It Up (dfs+路径记录)

Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3953    Accepted Submission(s): 2032 Problem Description Given a specified total t and a list of n integers, find all distinct sums usi

HDU 4704 Sum( 费马小定理 )

HDU 4704 Sum( 费马小定理 ) 理解能力果然拙计,,题目看半天没懂什么意思. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; #define MOD 1000000007 char str[100010]; LL fast_mod( LL a, int b) { LL res = 1; while( b )

hdu 4704 Sum (费马小定理+快速幂)

//(2^n-1)%mod //费马小定理:a^n ≡ a^(n%(m-1)) * a^(m-1)≡ a^(n%(m-1)) (mod m) # include <stdio.h> # include <algorithm> # include <string.h> # define mod 1000000007 using namespace std; __int64 pow(__int64 n) { __int64 p=1,q=2; while(n) { if(n%

杭电1024Max Sum Plus Plus

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目: Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now you are faced with a m

HDU 4704 Sum (隔板原理 + 费马小定理)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4704 题意: 给定一个数n 将其分解,Si 表示将n拆成i个数的方案数 求sum( si ) 1<=i<=n; 分析: 隔板原理,  n个木棍,n-1个缝, 分成1份则是C(n-1,0); 分成2份则是C(n-1,1); 分成3份则是C(n-1,2); ... 分成n份则是C(n-1,n-1); ans = sum( C(n-1,i) )   (0<=i<=n-1) =2^(n-1)

hdu 1258 Sum It Up(dfs+去重)

题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = [4,3,2,2,1,1]. 有四种不同的方法使得它们相加的结果等于total(即等于4),分别为:4,3+1,2+2, 2+1+1. 在同一种拼凑方式中,每个数字不能被重复使用,但是在list中可能存在许多相等的数字. 输入: 输入包含许多测试用例,每个用例仅占一行.每个用例包含t(total)

HDU 5776 sum (思维题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5776 题目让你求是否有区间的和是m的倍数. 预处理前缀和,一旦有两个数模m的值相同,说明中间一部分连续子列可以组成m的倍数. 1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include <algorithm> 3 #include <iostream> 4 #include <cs

MyBatis处理一行数据-MyBatis使用sum语句报错-MyBatis字段映射-遁地龙卷风

(-1)写在前面 我用的是MyBatis 3.2.4 (0) 编程轶事 select sum(value) ,sum(value2)  from integral_list where  MemberId = #{0} and operate = 1 and  Year(AddTime) = #{1} and ChannelType = #{2} and ChannelCode = #{3} 我用的sqlyoug显示的的字段名分别是sum(value) .sum(value2) 我在xml文件中

HDU 4704 Sum (高精度+快速幂+费马小定理+二项式定理)

Sum Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4704 Description Sample Input 2 Sample Output 2 Hint 1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cases. 题意:给定一