密碼盤 紀中 3067 狀壓dp

2021-07-16 21:21:51 字數 2651 閱讀 1058

如圖是某人設想中的n×n的密碼盤,用以顯示自己強大的智商以及計算能力。圖中每列上面有乙個0或1的值,每行左邊也有乙個0或1的值。密碼盤中有最多n*n個按鈕,每個按鈕有乙個數值。按鈕按下去之後,你會獲得按鈕上的分數,然後對應行和對應列的值會改變。

你的任務是,使每列上面的值和每行左邊的值一一對應相等(從左到右和從上到下),並且取得最大的積分。當然了初始積分為0。

第一行乙個正整數n,表示密碼盤的大小。n最大為9。

第二行乙個01串,表示從上到下每行左邊的n個值。

第三行乙個01串,表示從左到右每列上邊的n個值。

下一行乙個正整數k,表示按鈕的數量。1≤k≤n*n。

接下來k行,每行三個整數a、b、c,表示第a行第b列處有乙個數值為c的按鈕。左上角的格仔為第一行第一列。1≤a≤n,1≤b≤n,-100≤c≤100。不會有同乙個地方出現兩個按鈕。

輸出一行,包含乙個整數,表示所能取得的最大積分。如果不能使得每列上面的值和每行左邊的值一一對應相等,輸出「i am stupid!」。

謝謝olahiuj的提示

這是乙個狀壓dp,可以把從上到下每行左邊的n個值和從左到右每列上邊的n個值分別當做乙個二進位制數,表示狀態。

f[

l,i,

j]=m

ax(f

[l−1

,x,y

]+a[

l],f

[l−1

,i,j

])

i,j表示狀態.

x,y表示利用按鈕l可以從狀態x,y變成i,j.

a[l]表示按鈕l的值.

輸出時在f[k,i,i]中找到最大的

ps:可以用滾動陣列來滾動l.

const

maxn=1048;

type

arr=record

x,y,w:longint;

end;

var f:array[0..maxn,0..maxn,0..1] of longint;

push:array[0..100] of arr;

n,m,nm:longint;

x,y:longint;

procedure

init;

var i,j,k:longint;

c:char;

begin

readln(n);

nm:=0;

for i:=1

to n do

begin

read(c);

x:=x*2+ord(c)-48;

nm:=nm*2+1;

end;

readln;

for i:=1

to n do

begin

read(c);

y:=y*2+ord(c)-48;

end;

readln;

readln(m);

for i:=1

to m do

with push[i] do

readln(x,y,w);

for i:=0

to nm do

for j:=0

to nm do

f[i,j,1]:=-maxlongint;

f[x,y,1]:=0;

end;

function

max(x,y:longint):longint;

begin

if x>y then

exit(x)

else

exit(y);

end;

procedure

main;

var i,j,k,l:longint;

x1,y1:longint;

ans:longint;

begin

l:=1;

for k:=1

to m do

begin

for i:=0

to nm do

for j:=0

to nm do

begin

x1:=i xor (1

shl (n-push[k].y));

y1:=j xor (1

shl (n-push[k].x));

if f[x1,y1,l]<>-maxlongint

then f[i,j,l xor

1]:=max(f[x1,y1,l]+push[k].w,f[i,j,l])

else f[i,j,l xor

1]:=f[i,j,l];

end;

l:=l xor

1; end;

ans:=-maxlongint;

for i:=1

to nm do

for j:=i to i do

if f[i,j,l]>ans then ans:=f[i,j,l];

if ans<>-maxlongint

then

write(ans)

else

write('chutiren is stupid!!!');

end;

begin

init;

main;

end.

邦德 紀中 1236 狀壓dp

題目大意 每個人都知道詹姆斯邦德,著名的007,但很少有人知道很多任務都不是他親自完成的,而是由他的堂弟們吉公尺邦德完成 他有很多堂弟 詹姆斯已經厭倦了把乙個個任務分配給乙個個吉公尺,他向你求助。每個月,詹姆斯都會收到一些任務,根據他以前執行任務的經驗,他計算出了每個吉公尺完成每個任務的成功率,要求...

狀壓DP學習中的問題 2018 9 20

這道題是入門必做對吧,鋪1 2的地板,找到一篇大神講的,簡直了,程式設計之美的課後題也有乙個和整個題目一樣的。p269 題目這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的 磚塊,1 2 和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式...

BZOJ 1559 密碼 AC自動機 狀壓DP

求有多少個長度為l,且包含n個串的字串,答案小於等於42時輸出方案。n 10,l 25,s 10 常規的ac自動機上的壯壓dp,通過fail去掉那些被包含的字串即可。d p i j s dp i j s dp i j s 走了i ii步,當前在點j jj,已經走過的串的二進位制為s ss的方案數。d...