zoukankan      html  css  js  c++  java
  • 最大m子段和

    最大m子段和

    定义一串子段s1,s2,s3 ... sn-1,sn

    求m段不交叉最大子段和

    解:
    设dp[i][j]代表前j个数分成i段的最大和(包括a[j])

    状态转移方程:

    dp[i][j]=Max(dp[i][j-1]+a[j],dp[i-1][t]+a[j]) (i-1=<t<j)

    解释两种状态的最优解:
    ①.a[j]恰好在下一次最优解末项之后,将a[j]融入a[j-1]的子段中,总段数i不变,+a[j]
    ②.a[j]不在最优解末项之后,而是单独成一段,那么下一次递归对象总段数-1(i-1),末项为
    k,i-1=<t<j,k如果小于i-1负溢出。+a[j]

     

     1 #include<cstdio>
     2 using namespace std;
     3 int main()
     4 {
     5     int n, num, cnt, ans;
     6     while(scanf("%d", &n)!=EOF)
     7     {
     8         cnt = 0;
     9         for(int i=0; i<n; i++)
    10         {
    11             scanf("%d", &num);
    12             if(cnt==0)
    13             {
    14                 ans = num;
    15                 cnt++;
    16             }
    17             else
    18             {
    19                 if(num==ans)
    20                     cnt++;
    21                 else
    22                     cnt--;
    23             }
    24         }
    25         printf("%d
    ", ans);
    26     }
    27     return 0;
    28 }
  • 相关阅读:
    一般查找 (顺序查找)
    sscanf
    uva-11044-水题
    uva-10785-模拟水题
    uva-10596-欧拉回路
    uva-10879-因数分解
    uva-10562-二叉树
    扯皮的cplex-感觉时间不对
    cplex-Java-样例代码解析
    cplexJava源码---计算结果
  • 原文地址:https://www.cnblogs.com/wuruofeng/p/9867286.html
Copyright © 2011-2022 走看看