zoukankan      html  css  js  c++  java
  • 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 ", 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
    ", 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
    ", sum) ;
    38    }
    39    return 0;
    40 } 
    
    
    
    
    
  • 相关阅读:
    CentOS 7.0安装Zimbra 8.6邮件服务器
    centos7备份还原与grub2引导和rescue模式修改root密码
    通过grub硬盘安装centos7
    CentOS系统中常用查看系统信息和日志命令小结
    安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)
    linux 下shell脚本执行多个命令的方法
    centos Crontab
    抓取某网站信息时遇到的问题及解决 The character set provided in ContentType is invalid. Cannot read content as string using an invalid character set
    HttpClient不必每次新建实例而RestSharp推荐新建实例的原因
    .net core读取json配置文件
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3875513.html
Copyright © 2011-2022 走看看