題解非常基礎的一道狀壓dp
我們用二進位制來表示每一行取數情況,1
11表示取,0
00表示不取
很容易得到狀態轉移方程:
f [i
][j]
=max
(f[i
][j]
,f[i
−1][
k]+a
ns[i
][j]
);f[i][j]=max(f[i][j],f[i-1][k]+ans[i][j]);
f[i][j
]=ma
x(f[
i][j
],f[
i−1]
[k]+
ans[
i][j
]);當且僅當j
jj&k==
0k==0
k==0
時**
#include
#define m 150009
using
namespace std;
intread()
for(
;isdigit
(ch)
;ch=
getchar()
) re=
(re<<3)
+(re<<1)
+ch-
'0';
return re*f;
}int f[25]
[m],ans[25]
[m],a[25]
[25],cnt,maxn,c[m]
,n,s[25]
;void
clear()
signed
main()
}}for(
int i=
1;i<=n;i++)}
}printf
("%d\n"
,maxn);}
return0;
}
題解
顯然直接bfs是不行的
那麼我們用二進位制來表示是否具有該鑰匙的狀態,每到乙個地方更新狀態即可
**細節較多
**
#include
#define m 1509
using
namespace std;
intread()
for(
;isdigit
(ch)
;ch=
getchar()
) re=
(re<<3)
+(re<<1)
+ch-
'0';
return re*f;
}int dx[4]
=;int dy[4]
=;int n,m,t,ans;
bool vis[21]
[21][m]
;char mp[49]
[49],s[40]
;struct pointst;
bool
check
(int x,
int y)
void
bfs(
)for
(int i=
0;i<
4;i++)}
else
if(mp[nxt.x]
[nxt.y]
>=
'a'&&mp[nxt.x]
[nxt.y]
<=
'z')
}else}}
}}ans=-1
;return;}
signed
main()
}bfs()
,printf
("%d\n"
,ans);}
return0;
}
題解
一道經典的狀壓dp,細節較多
**
#include
#define int long long
using
namespace std;
int n,m,s[
100]
,ma[
109]
,num[
100]
,cnt,dp[
101]
[101][
110]
;int
read()
for(
;isdigit
(ch)
;ch=
getchar()
) re=
(re<<3)
+(re<<1)
+ch-
'0';
return re*f;
}boolpd(
int x)
intnum_one
(int x)
return sum;
}void
init()
}bool
zjf(
int x,
int y)
intsolve()
for(
int i=
2;i<=n;i++
)for
(int j=
0;j(zjf
(ma[i]
,s[j]))
for(
int k=
0;k(zjf
(ma[i-1]
,s[k])&&
(s[j]
&s[k])==
0)return ans;
}signed
main()
init()
; cout<<
solve()
<
return0;
}}
習題 國王(狀壓DP)
題目 記憶體限制 64 mib時間限制 500 ms標準輸入輸出 題目型別 傳統評測方式 文字比較 提交提交記錄 返回比賽 題目描述 原題來自 sgu 223 在 n n的棋盤上放k 個國王,國王可攻擊相鄰的 8個格仔,求使它們無法互相攻擊的方案總數。輸入格式 只有一行,包含兩個整數 n 和k 輸出...
狀壓dp(基礎)
題目大意 有乙個m n的矩陣 每乙個方格就是一塊牧場 每乙個牧場適合種玉公尺用1表示 不適合用0表示,放牧時相鄰的兩塊玉公尺地只能有一頭牛 求有多少種放牧方案 一頭牛也不放也是一種 資料範圍 1 m 12 1 n 12 輸入 第一行 n,m,接下來是 m n的矩陣 1表示適合種玉公尺 0表示不適合 ...
狀壓dp 玉公尺田 狀壓dp
相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...