1020 德玛西亚万岁 状压DP
2022/8/2 23:23:01
本文主要是介绍1020 德玛西亚万岁 状压DP,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
链接: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; } /*样例区 */ //------------------------------------------------------------
这篇关于1020 德玛西亚万岁 状压DP的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-28一步到位:购买适合 SEO 的域名全攻略
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南
- 2024-12-27JWT单点登录原理学习入门