您的位置:首页 > 其它

工业时代

2015-11-03 15:00 399 查看
工业时代
【试题描述】
小 FF 的第一片矿区已经开始运作了, 他着手开展第二片矿区……
小 FF 的第二片矿区, 也是”NewBe_One“计划的核心部分, 因为在这片矿区里面有全
宇宙最稀有的两种矿物,科学家称其为 NEW 矿和 BE 矿。
矿区是被划分成一个 n*m 的矩形区域。 小 FF 探明了每一小块区域里的 NEW 矿和 BE
矿的蕴藏量, 并且小 FF 还在矿区的北边和西边分别设置了 NEW 矿和 BE 矿的收集站。你
的任务是设计一个管道运输系统,使得运送的 NEW 矿和 BE 矿的总量最多。
管道的型号有两种,一种是东西向,一种是南北向。在一个格子内你能建造一种管道,
但不能两种都建。如果两个同类型管道首位相接,它们就可以被连接起来。
另外这些矿物都十分不稳定, 因此它们在运送过程中都不能拐弯。 这就意味着如果某个
格子上建有南北向管道, 但是它北边的格子建有东西向管道, 那么这根南北向管道内运送的
任何东西都将丢失。进一步地,运到 NEW 矿收集站的 BE 矿也会丢失,运到 BE 矿收集站
的 NEW 矿也会丢失。
NOIP2010 模拟试题
【输入格式】
第一行包含两个整数 n 和 m,表示矿区大小。
以下 n 行,每行 m 个整数,其中第 i 行第 j 个整数 G[ i , j ] 描述各个格子上的 BE 矿数
量。接下来以类似的矩阵表示各个格子上的 NEW 矿数量。
【输出格式】
仅一个整数, 表示最多可以采集到的 NEW 矿和 BE 矿的总量。
【输入样例】
4 4
0 0 10 9
1 3 10 0
4 2 1 3
1 1 20 0
10 0 0 0
1 1 1 30
0 0 5 5
5 10 10 10
【输出样例】
98
【数据范围】
对于 30%的数据: 0<= n,m <=100;
对于 100%的数据: 0<= n, m <=1000;
0<= G[ i, j ] <=1000.

思路:动态规划

program t1;
var n,m,m1,m2,i,j,k,ans:longint;
new,be:array[1..1000,1..1000]of longint;
a,b:array[0..1000,0..1000]of longint;
//a[i,j]表示第i行从1到j be矿的总数量 b[i,j]表示第i列从1到i new矿的总数量
f:array[0..1000,0..1000,0..1]of longint;
//f[i,j,0]表示以点(i,j)为右下角,点(i,j)建立be矿管的最大采矿量
//f[i,j,1]表示以点(i,j)为右下角,点(i,j)建立new矿管的最大采矿量
function max(a,b:longint):longint ;
begin
if a>b then exit(a) else exit(b);
end;
begin
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do read(be[i,j]);
readln;
end;
for i:=1 to n do
begin
for j:=1 to m do read(new[i,j]);
readln;
end;
for i:=1 to n do
for j:=1 to m do
a[i,j]:=a[i,j-1]+be[i,j];//求数组afor i:=1 to m do
for j:=1 to n do
b[i,j]:=b[i,j-1]+new[j,i]{第j行第i列};//求数组b
for i:=1 to n do
for j:=1 to m do
begin
f[i,j,0]:=max(f[i-1,j,0],f[i-1,j,1])+a[i,j];//动归策略
f[i,j,1]:=max(f[i,j-1,0],f[i,j-1,1])+b[j,i];//动归策略
end;
ans:=max(f[n,m,0],f[n,m,1]);
writeln(ans);
end.


一点反思:前两次一直在超时……现在总算不超时了。求数组a,b一定要递推求,不能循环。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: