「JoyOI1094」矩形分割
题目描述
出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块。 对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同的代价。而且,对于一块木板,切割一次以后就被分割成两块,而且不能把这两块木板拼在一起然后一刀切成四块,只能两块分别再进行一次切割。 现在,给出从不同的线切割所要花的代价,求把整块木板分割成1×1块小方块所需要耗费的最小代价。
输入
输入文件第一行包括N和M,表示长N宽M的矩阵。 第二行包括N-1个非负整数,分别表示沿着N-1条横线切割的代价。 第二行包括M-1个非负整数,分别表示沿着M-1条竖线切割的代价。
输出
输出一个整数,表示最小代价。
样例输入
2 2 3 3
样例输出
9
提示
对于60%的数据,有1 ≤ N ,M≤ 100; 对于100%的数据,有1 ≤ N,M ≤ 2000。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct data{ bool flag;//横,竖 int v; }a[4001]; int n,m,h=1,s=1,ans; inline bool cp(data a,data b){return a.v>b.v;} int main() { scanf("%d%d",&n,&m); n--;m--; for(int i=1;i<=n;i++)scanf("%d",&a[i].v); for(int i=1;i<=m;i++){scanf("%d",&a[i+n].v);a[i+n].flag=1;} sort(a+1,a+n+m+1,cp); for(int i=1;i<=n+m;i++) { if(!a[i].flag){h++;ans+=a[i].v*s;} else{s++;ans+=a[i].v*h;} } printf("%d",ans); return 0; } |
Subscribe