花店橱窗设计
(flower.pas/c/cpp)
【问题描述】
每一个花瓶的形状和颜色也不相同,因此,当各个花瓶中放人不同的花束时会产生不同的美学效果,并以美学值(一个整数)来表示,空置花瓶的美学值为0。在上述例子中,花瓶与花束的不同搭配所具有的美学值,可以用如下表格表示。
根据表格,杜鹃花放在花瓶2中,会显得非常好看,但若放在花瓶4中则显得很难看。
┌───┬───┬───┬───┬───┬───┐
│
├───┼───┼───┼───┼───┼───┤
│杜鹃花│
├───┼───┼───┼───┼───┼───┤
│秋海棠│
├───┼───┼───┼───┼───┼───┤
│康乃馨│
└───┴───┴───┴───┴───┴───┘
【输入文件】
【输出文件】
包含两行:第一行是程序所产生摆放方式的美学值。第二行必须用F 个数表示摆放方式,即该行的第K个数表示花束K所在的花瓶的编号。
【输入样例】
3 5
7 23 –5 –24 16
5 21 -4 10 23
-21 5 -4 -20 20
【输出样例】
53
2 4 5
================================================================
注意阶段的转移..是由哪个阶段转移过来的...
============================
{
ID:jie19952
PROG:
LANG:PASCAL
}
var
f,v:longint;
a:array[1..100,1..100]of longint;
opt,path:array[0..100,0..100]of longint;
procedure init;
begin
assign(input,'flower.in');
assign(output,'flower.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
procedure print(i,j:longint);
begin
if i>0 then
begin
print(i-1,path[i,j]);
write(j,' ');
end;
end;
procedure main;
var
i,j,k:longint;
ans:longint;
begin
readln(f,v);
for i:=1 to f do
for j:=1 to v do
begin
read(a[i,j]);
end;
fillchar(opt,sizeof(opt),0);
for i:=1 to f do
for j:=1 to v do
opt[i,j]:=-maxlongint;
//fillchar(path,sizeof(path),0);
//for i:=1 to v-f do opt[0,i]:=0;
for i:=1 to f do
for j:=i to v-(f-i) do
begin
for k:=i-1 to j-1 do
begin
if opt[i,j]<opt[i-1,k] then
begin
opt[i,j]:=opt[i-1,k];
path[i,j]:=k;
end;
end;
opt[i,j]:=opt[i,j]+a[i,j];
end;
ans:=f;
for i:=f+1 to v do
if opt[f,i]>opt[f,ans] then ans:=i;
writeln(opt[f,ans]);
print(f,ans);
end;
begin
init;
main;
terminate;
end.