关闭

最小m段和

标签: 动态规划
266人阅读 评论(0) 收藏 举报
分类:

题目描述:
给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?

题目类型:动态规划

题目分析:

n个数字,分成m段,使这m段子序列的和的最大值达到最小
状态转移方程:s[i][j]=min{max{s[i][1]-s[k][1],s[k][j-1]}}
s[i][j]表示 前i个数字分成j段。
可以这样理解,1 2 3…k…i,前k个数据的(j-1)段的值与(k到i)的值的最大值,其中k到i的值就是上面s[i][1]-s[k][1]的值。
代码如下:

#include<stdio.h>
#include<string.h>
int a[20];
int s[100][100];
int set(int n,int m)
{
    int i,j,k,temp,maxsum;
    for(i=1;i<=n;i++) {  //s[i][1]表示前i个数字分成1段的值,即前i个数字之和   
        s[i][1]=s[i-1][1]+a[i];
    }
    for(j=2;j<=m;j++) {    //从2开始,分割为m段 
        //将前i个数字分割成j段(最小需要j个数字,从i=j开始即可,无需从2开始)
        for(i=j;i<=n;i++) {
            temp=10000000;
            for(k=j;k<i;k++) {
                maxsum=(s[i][1]-s[k][1])>s[k][j-1]?(s[i][1]-s[k][1]):s[k][j-1];
                if(temp>maxsum) {
                    temp=maxsum;
                }
            }
            s[i][j]=temp;
        }
    }
    return s[n][m];
}

int main()
{
    int i,j,n,m;
    scanf("%d%d",&n,&m);
    memset(s,0,sizeof(s));
    for(i=1;i<=n;i++) {
        scanf("%d",&a[i]);
    }
    memset(s,0,sizeof(s));
    printf("%d\n",set(n,m));
    return 0;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

(5)最大m段子序列和问题____动态规划

最大m段子序列和问题: 一段数列中,选取m段不重叠的子序列,要求其总和最大.  区别于 最大子序列合 这类问题还是动态规划. 定义 dp[ i ] [ j ] 为 前面 j ...
  • y1196645376
  • y1196645376
  • 2015-03-18 21:45
  • 1214

hdu1024 Max Sum Plus Plus(M段子序列的最大和)

会做一段子序列的最大和,但没想到M段子序列的最大和这么难,完全不会啊! 看了题解几乎清一色都是这种做法,方法和一段子序列的思路完全不一样啊。。。 dp[j]表示以第j个元素结尾的i个子段的...
  • Flynn_curry
  • Flynn_curry
  • 2016-02-17 12:16
  • 1065

第九次CCF CSP认证试题

1问题描述 试题编号: 1 试题名称: 中间数 时间限制: 1.0s 内存限制: 2...
  • qq_30062589
  • qq_30062589
  • 2016-12-18 18:15
  • 1962

南邮 OJ 1230 最小m段和问题

最小m段和问题 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 114     &...
  • changshu1
  • changshu1
  • 2015-08-05 13:53
  • 623

小白笔记------------------最小m段和问题

最近在看动态规划法,对状态转移方程总是写不出来例如今天这个问题: 这个问题怎么才能抽象出状态转移方程呢? 我们考虑将5个数分成3段的情形,首先考虑分成1段的时候,一个数只能分成1个段,则f[1][1]...
  • Aaron92
  • Aaron92
  • 2016-06-07 21:47
  • 374

算法 最小M段和问题

题目给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。 如何分割才能使这m段子序列的和的最大值达到最小? 分析动态规划。 方程: f[i][j] = min{...
  • plain_maple
  • plain_maple
  • 2016-12-24 17:15
  • 1300

最小M段和 O(nlogn)快速算法

先声明,这算法我还没弄出来《数列分割》解题报告[题目描述]给出一个长为N的整数数列(N≤15000),要求求出最小的M,使得存在一种将数列分成恰好K份的方案(每份是数列上连续的一段,且不得为空),每份...
  • chenwenxiaocom
  • chenwenxiaocom
  • 2011-05-24 15:09
  • 1284

最小m段和问题

/******************************************************************** ** @file njupt1230.cpp **...
  • zhuyingqingfen
  • zhuyingqingfen
  • 2011-04-23 21:00
  • 3113

校OJ 最大m段乘积和最小m段和

描述:给一个n位的数和m,代表将n位数分成m段,求最大m段乘积和最小m段和,同样也可以求m段的最小积和最大和,原理一样 刚开始的时候并没有做得出来,因为dp的状态转移方程写错了,还是太嫩了,...
  • Lin_disguiser
  • Lin_disguiser
  • 2016-01-09 01:19
  • 326

M8最小系统图

  • 2012-02-09 00:16
  • 248KB
  • 下载
    个人资料
    • 访问:118414次
    • 积分:2290
    • 等级:
    • 排名:第18859名
    • 原创:122篇
    • 转载:4篇
    • 译文:0篇
    • 评论:39条
    博客专栏
    最新评论