链接:https://ac.nowcoder.com/acm/contest/25022/1020
来源:牛客网
题目描述
德玛西亚是一个实力雄厚、奉公守法的国家,有着功勋卓著的光荣军史。
这里非常重视正义、荣耀、职责的意识形态,这里的人民为此感到强烈自豪。
有一天他们想去制裁邪恶的比尔吉沃特,于是派遣了自己最优秀的战士。
结果比尔吉沃特领土太小,只有长为n宽为m共计n*m块土地,其中有些土
地标记为0表示为高山峻岭或者深海湖泊,英雄们无法在其中站立,只有标
记为1的土地才能容纳一个英雄。德玛西亚的英雄们战斗时有一个特点,他
们不希望队友站在自己旁边显得很暧昧。请问最多能有多少种安排德玛西
亚英雄的方法?
输入描述:
输入包含多组测试数据;
每组数据的第一行包含2个整数n和m (n <= 12, m <= 12 ),之间用空格隔开;
接下来的n行,每行m个数,表示n*m的比尔吉沃特领土。
输出描述:
输出一个整数n代表安排应用的方法。
(答案取膜100000000)
示例1
输入
3 3 1 1 1 0 1 1 1 0 0
输出
24
分析
同类型状压DP
ps:注意数据范围,防止段错误。地图可以只存障碍物。上一层要跟上一层比较。这题是方案个数,所以初始情况初始化成1.
//-------------------------代码----------------------------
//#define int ll
const int N = 2e6+10,mod = 1e8;
int n,m;
ll dp[15][1 << 13];
vector<int> s;
vector<int > num;
ll mp[15];
void solve()
{
s.clear();num.clear();
fo(i,0,(1<<m)-1) {
if(i << 1 & i) continue;
s.pb(i);
bitset<64>bt(i);
num.pb(bt.count());
}
fo(i,1,n) {
mp[i] = 0;
fo(j,1,m) {
int x;cin>>x;
if(!x)mp[i] |= 1 <<(m - j);
}
}
ms(dp,0);
dp[0][0] = 1;
int cnt = s.size() - 1;
fo(i,1,n+1) {
fo(j,0,cnt) {
if(mp[i] & s[j]) continue;
fo(k,0,cnt) {
if(mp[i-1] & s[k]) continue;
if(s[k] & s[j]) continue;
dp[i][j] =(dp[i][j] + dp[i-1][k] + mod) % mod;
}
}
}
cout<<dp[n+1][0]<<endl;
}
signed main(){
clapping();TLE;
// int t;cin>>t;while(t -- )
while(cin>>n>>m)
solve();
// {solve(); }
return 0;
}
/*样例区
*/
//------------------------------------------------------------
原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/278481.html