演算法:dp
分析:本題很容易就看出dp的影子來,關鍵是如何dp,腫麼dp。
用f[i,j]表示在起始點不超過i,終止點不超過j的情況下的最大取值。因為不能包含,因此可以從f[i-1,j]或f[i,j-1]中的最大值轉移而來。
但是還可以由f[i-1,j-1]+s[j]-s[i-1](lo<=s[j]-s[i-1]<=hi)轉移而來,因此本題可以說是對lcs的乙個變形,同樣是就看你理解的是否深刻了。
program mwand;
const
maxn=1000;
var n,lo,hi:longint;
s1,s2:array [0..maxn] of longint;
f:array [0..maxn,0..maxn] of int64;
procedure init;
var i:longint;
begin
readln(n,lo,hi);
for i:=1 to n do
begin
read(s1[i]);
inc(s1[i],s1[i-1]);
end;
readln;
for i:=1 to n do
begin
read(s2[i]);
inc(s2[i],s2[i-1]);
end;
end;
function max(x,y:int64):int64;
begin
if x>y then exit(x) else exit(y);
end;
function can(x,y:longint):boolean;
begin
if (s1[y]-s1[x-1]>=lo) and (s1[y]-s1[x-1]<=hi) then exit(true) else exit(false);
end;
procedure main;
var i,j:longint;
begin
for i:=1 to n do
begin
for j:=i to n do
begin
f[i,j]:=max(f[i-1,j],f[i,j-1]);
if can(i,j) then f[i,j]:=max(f[i,j],f[i-1,j-1]+s2[j]-s2[i-1]);
end;
end;
end;
begin
assign(input,'mwand.in'); reset(input);
assign(output,'mwand.out'); rewrite(output);
init;
main;
writeln(f[n,n]);
close(input); close(output);
end.
Vijos 佳佳的魔法藥水 最短路
發完了k張 佳佳卻得到了乙個壞訊息 他的mm得病了!佳佳和大家一樣焦急萬分!治好mm的病只有一種辦法,那就是傳說中的0號藥水 怎麼樣才能得到0號藥水呢?你要知道佳佳的家境也不是很好,成本得足夠低才行 得到一種藥水有兩種方法 可以按照魔法書上的指導自己配置,也可以到魔法商店裡去買 那裡對於每種藥水都有...
佳佳的魔法藥水 樹型dp
發完了 k 張 佳佳卻得到了乙個壞訊息 他的 mm 得病了!佳佳和大家一樣焦急 萬分!治好 mm 的病只有一種辦法,那就是傳說中的 0 號藥水 怎麼樣才能得到 0 號藥 水呢?你要知道佳佳的家境也不是很好,成本得足夠低才行 得到一種藥水有兩種方法 可以按照魔法書上的指導自己配置,也可以到魔法商店裡去...
P1875 佳佳的魔法藥水
題意 給出0 n 1號藥水的價錢 我們要用最少的錢買0號藥水 題目中會給出某兩種藥水的融合品 讓我們找出最少花的錢和方案數 思路 一開始做這道題的時候,想到的肯定就是最短路了,於是我朝著spfa方面想 可是,我在建圖方面並不知道怎麼建。想了大概乙個小時也不知道如何建圖 然後看了別人的題解,發現很多人...