洛谷 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的情况,有更好的方法可以自行尝试
浙公网安备 33010602011771号