NOIP2006提高组满分源代码
注:来源: www.oiers.cn
energy:
{
Problem: Noip 2006 Problem 1
Algorithm: Dynamic Programming
}
const
maxn = 100;
var
n, i, j, k, p, ans:longint;
data:array[1..maxn,1..2] of longint;
dp:array[1..maxn,1..maxn] of longint;
function max(a, b:longint):longint;
begin
if a > b then max:=a else max:=b;
end;
begin
assign(input,'energy.in');
reset(input);
assign(output,'energy.out');
rewrite(output);
{ input }
read(n);
for i:=1 to n do read(data[i, 1]);
{ Main }
data[n, 2]:=data[1, 1];
for i:=1 to n - 1 do data[i, 2]:=data[i+1, 1];
fillchar(dp, sizeof(dp), 0);
for p:=1 to n-1 do
for i:=1 to n do
begin
j:=(i + p - 1) mod n + 1;
if i < j then
begin
for k:=i to j-1 do
dp[i, j]:=max(dp[i, j], dp[i, k] + dp[k+1, j] +
data[i, 1] * data[k, 2] * data[j, 2]);
end;
if i > j then
begin
for k:=i to n-1 do
dp[i, j]:=max(dp[i, j], dp[i, k] + dp[k+1, j] +
data[i, 1] * data[k, 2] * data[j, 2]);
dp[i, j]:=max(dp[i, j], dp[i, n] + dp[1, j] +
data[i, 1] * data[n, 2] * data[j, 2]);
for k:=1 to j-1 do
dp[i, j]:=max(dp[i, j], dp[i, k] + dp[k+1, j] +
data[i, 1] * data[k, 2] * data[j, 2]);
end;
end;
{ output }
ans:=-1;
for i:=1 to n do
begin
j:=(i + n - 2) mod n + 1;
ans:=max(ans, dp[i, j]);
end;
writeln(ans);
close(input);
close(output);
end.
JSP:
{
Problem: Noip 2006 Problem 3
Algorithm: Simulation
}
const
maxn = 20;
maxm = 20;
maxs =