【dp】最小m段和问题

来源:互联网 发布:淘宝联盟能用红包吗 编辑:程序博客网 时间:2024/05/18 02:09

问题描述:

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

编程任务:

 给定n个整数组成的序列,编程计算该序列的最优m段分割,使m段子序列的和的最大值达到  最小。

数据输入:

 输入的第1行中有2个正整数n和m。正整数n是序列的长度;正整数m是分割的断数。接下来  的一行中有n个整数。

结果输出:

 输出的第1行中的数是计算出的m段子序列的和的最大值的最小值。

样例:

 1 1
 10

10

核心思想:

 二分答案+贪心验证

var a:array[0..200]of longint; n,m,i,l,r,tot:longint;function pd(x:longint):boolean;var i,ans,sum:longint;begin ans:=1;sum:=0; fori:=1 to n do begin   ifa[i]>x then exit(false);   ifsum+a[i]<=x then inc(sum,a[i])   else    begin     inc(ans);     sum:=a[i];    end;   ifans>m then exit(false); end; exit(true);end;begin assign(input,'p310.in');reset(input); assign(output,'p310.out');rewrite(output); readln(n,m); fori:=1 to n do begin  read(a[i]);  inc(tot,a[i]); end; l:=0;r:=tot; while l<r do  ifpd((l+r)shr 1) then r:=(l+r)shr 1  else l:=(l+r)shr 1+1; writeln(l); close(input);close(output);end.
题目来源:《算法设计与分析》第三章动态规划

原创粉丝点击