如圖是某人設想中的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...