佳佳的魔法杖(mwand)

2021-05-28 02:17:50 字數 1472 閱讀 9145

演算法: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方面想 可是,我在建圖方面並不知道怎麼建。想了大概乙個小時也不知道如何建圖 然後看了別人的題解,發現很多人...