[贪心] 矩形分割

 

描述 Description

 

 

出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块。
对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同的代价。而且,对于一块木板,切割一次以后就被分割成两块,而且不能把这两块木板拼在一起然后一刀切成四块,只能两块分别再进行一次切割。
现在,给出从不同的线切割所要花的代价,求把整块木板分割成1×1块小方块所需要耗费的最小代价。

 

 

 

 

 

 

 

输入格式 Input Format

 

 

输入文件第一行包括N和M,表示长N宽M的矩阵。
第二行包括N-1个非负整数,分别表示沿着N-1条横线切割的代价。
第二行包括M-1个非负整数,分别表示沿着M-1条竖线切割的代价。

 

 

 

 

 

 

 

输出格式 Output Format

 

 

输出一个整数,表示最小代价。

 

 

 

 

 

 

 

样例输入 Sample Input [复制数据]

 

 

2 2 3 3

 

 

 

 

 

 

 

样例输出 Sample Output [复制数据]

 

 

9

 

 

 

 

 

 

 

时间限制 Time Limitation

 

 

1s

 

 

 

 

 

 

 

注释 Hint

 

 

对于60%的数据,有1 ≤ N ,M≤ 100;
对于100%的数据,有1 ≤ N,M ≤ 2000。

 

 

开始以为是动态规划.想了想发现是贪心.

可以观察到切的刀数是固定的,n*m-1刀.

而且对于一个代价,越到后面切,代价越大.

自然想到应该使代价大的尽量早点切。

所以给代价排个序,标记一下横 纵

当我们想横着切一刀的时候{画一条穿过矩形的线}

代价为 竖着切的次数*代价

竖着切是横着切的次数*代价

所以给代价排个序,随便搞搞就没了。

 

第一个自己想出来的贪心。。。给输入坑了次。。

var n,m,i,ans,l,r:longint;
    a,f:array[1..4000]of longint;

procedure qsort(l,r:longint);
var i,j,s,x:longint;
begin
    i:=l;j:=r;x:=a[(l+r)div 2];
    while i<=j do
    begin
        while a[i]>x do inc(i);
        while a[j]


 

你可能感兴趣的:(贪心,NOIP2012前的奋斗)