洛谷 P1133 教主的花园(多维DP)

题目描述

教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值。

教主最喜欢3种树,这3种树的高度分别为10,20,30。教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高。

输入输出格式

输入格式:
输入文件garden.in的第1行为一个正整数n,表示需要种的树的棵树。

接下来n行,每行3个不超过10000的正整数ai,bi,ci,按顺时针顺序表示了第i个位置种高度为10,20,30的树能获得的观赏价值。

第i个位置的树与第i+1个位置的树相邻,特别地,第1个位置的树与第n个位置的树相邻。

输出格式:
输出文件garden.out仅包括一个正整数,为最大的观赏价值和。

输入输出样例

输入样例#1:
4
1 3 2
3 1 2
3 1 2
3 1 2
输出样例#1:
11
说明

【样例说明】

第1~n个位置分别种上高度为20,10,30,10的树,价值最高。

【数据规模与约定】

对于20%的数据,有n≤10;

对于40%的数据,有n≤100;

对于60%的数据,有n≤1000;

对于100%的数据,有4≤n≤100000,并保证n一定为偶数。

program df;
var i,j,n,m,x,y,z,k,t:longint;
a:array[0..200000,0..3] of longint;
f:array[0..200000,1..3,1..2] of longint;

function max(x,y:longint):longint;
begin
if x>y then exit(x)
else exit(y);
end;

begin
readln(n);
for i:=1 to n do
begin
for j:=1 to 3 do
read(a[i,j]);
readln;
end;
for i:=2 to n do //i代表第几个位置(不从第一个开始在后面有解释)
for j:=1 to 3 do //j表示种第几种树
begin
for k:=1 to j-1 do //第三维等于1的代表现在要种的这棵树一定要比上一棵树高
f[i,j,1]:=max(f[i,j,1],f[i-1,k,2]+a[i,j]); //上一棵树一定是它矮的树
for k:=j+1 to 3 do //等于2时与上面情况相反
f[i,j,2]:=max(f[i,j,2],f[i-1,k,1]+a[i,j]);
end;
t:=0;
t:=max(max(f[n,1,2]+a[1,2],f[n,1,2]+a[1,3]),t); //最后一个位置种10的树,则第一个位置一定比他高可以种20或30
t:=max(max(f[n,2,1]+a[1,1],f[n,2,2]+a[1,3]),t); //最后一个位置种20的树,则第一个位置若比它高则种30,比它矮则种10
t:=max(max(f[n,3,1]+a[1,1],f[n,3,1]+a[1,2]),t);//最后一个位置种30的树,则第一个位置一定比它矮可以种10或20
writeln(t);

end. //其实主要为了避免起点和终点都种20的情况,有更好的方法可以自行尝试

posted @ 2017-02-09 20:22  Gxyhqzt  阅读(170)  评论(0)    收藏  举报