试题描述
小FF的第一片矿区已经开始运作了, 他着手开展第二片矿区……
小FF的第二片矿区, 也是”NewBe_One“计划的核心部分, 因为在这片矿区里面有全宇宙最稀有的两种矿物,科学家称其为NEW矿和BE矿。
矿区是被划分成一个n*m的矩形区域。 小FF探明了每一小块区域里的NEW矿和BE矿的蕴藏量, 并且小FF还在矿区的北边和西边分别设置了NEW矿和BE矿的收集站。你的任务是设计一个管道运输系统,使得运送的NEW矿和BE矿的总量最多。
管道的型号有两种,一种是东西向,一种是南北向。在一个格子内你能建造一种管道,但不能两种都建。如果两个同类型管道首位相接,它们就可以被连接起来。
另外这些矿物都十分不稳定,因此它们在运送过程中都不能拐弯。这就意味着如果某个格子上建有南北向管道,但是它北边的格子建有东西向管道,那么这根南北向管道内运送的任何东西都将丢失。进一步地,运到NEW矿收集站的BE矿也会丢失,运到BE矿收集站的NEW矿也会丢失。
输入格式
第一行包含两个整数n和m,表示矿区大小。
以下n行,每行m个整数,其中第i行第j个整数G[ i , j ] 描述各个格子上的BE矿数量。接下来以类似的矩阵表示各个格子上的NEW矿数量。
输出格式
仅一个整数, 表示最多可以采集到的NEW矿和BE矿的总量。
输入样例
4 40 0 10 91 3 10 04 2 1 31 1 20 010 0 0 01 1 1 300 0 5 55 10 10 10
输出样例
98
数据范围
对于30%的数据: 0<= n,m <=100; 对于100%的数据: 0<= n, m <=1000; 0<= G[ i, j ] <=1000.
思路
动态规划。到达此点的可能性路线有两个,要么纵坐标减一这是铺NEW的,它本身联通所有横线上的铺BE;或者是横坐标减一铺BE,它本身联通所有纵线上的铺NEW。反之他一定要铺一种吧。
var i,j,k,n,m,tem:longint; f,be,new:array[0..2000,0..2000] of longint; function max(a,b:longint):longint; begin if a<b then exit(b) else exit(a); end; begin assign(input,'industry.in');reset(input); assign(output,'industry.out');rewrite(output); readln(n,m); for i:=1 to n do for j:=1 to m do begin read(tem); be[i,j]:=be[i,j-1]+tem; end; for i:=1 to n do for j:=1 to m do begin read(tem); new[i,j]:=new[i-1,j]+tem; end; for i:=1 to n do for j:=1 to m do f[i,j]:=max(f[i-1,j]+be[i,j],f[i,j-1]+new[i,j]); writeln(f[n,m]); close(input);close(output); end.