【状压DP】【cofun1375】麦田
【cofun1375】麦田
Description
话说公元199年,曹操准备与袁绍进行官渡决战。为整肃军纪,曹操下令:“全军将士,上至统帅,下至马佚,行军训练,不准践踏庄稼,不准倒犯民利,违令者斩首。”遇有麦场,骑兵下马,扶麦而行。百姓见状,交口称赞。
不巧,在一次出巡时,曹操乘坐的战马受惊,跃入麦田,践踏了一片麦苗。曹操当即下马,请求主簿依军令将自己斩首示众。在众将领劝说下,割发代首,以儆效尤,此事才算了结。
然而,为了赢得官渡之战,曹操又遇到了麻烦。为了对袁绍的一路军队进行埋伏,需要在麦田中设立几个埋伏点,而且几个点之间,还需要有道路相通。埋伏点和道路均会将所在格子麦苗破坏掉。这可难为了刚刚割发代首的曹孟德。经过重重的抉择,曹操发布了一个刚刚作出的艰难决定:“按破坏麦苗数加倍赔偿”。 作为曹操的得力军师,你希望为主公分忧,妥善解决这个问题:
埋伏所在麦田分成了n*m方格,每格麦苗数不同。其中有k个格子将作为埋伏点,需要设立道路,使得每2个埋伏点之间均相通。主公希望剩下的麦苗越多越好。
Input Format
第一行 n m k(1<=n,m<=100 nm<=200 1<=k<=7)。 接下来为nm的矩阵,表示第i行j列的格子的麦苗数。 最后k行,每行包含2个整数,表示(i,j)格为埋伏点。(0<=i < n 0< = j < m)
Output Format
输出麦苗最多能剩余多少
Sample Input
4 4 4
2 7 9 5
4 3 5 5
7 6 7 5
8 2 1 7
1 0
0 1
1 1
0 2
Sample Output
60
分析:
k <= 7,类似棋盘,考虑状压DP。用f[i][x][y]表示当前设置埋伏状态为i(0:未设/ 1:设),到达格子为(x,y)时需要破坏的最少麦苗。
状压DP,转移方程:
f[i][x][y] = min(f[i][x][y], f[i - j][x][y] + f[j][x][y] - a[x][y]);
- 注意到每次循环完状态i应做一遍类似spfa的bfs,把到达其他格子时状态相同的情况计算出来。
- 代码:
#include <bits/stdc++.h>using namespace std;const int g[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};int n, m, k, x, y, i, j, head, tail, s, ans, a[105][105], q[10005][2], f[1 << 8][105][105];bool v[105][105];inline int read(){int x = 0, w = 1;char ch = 0;while(ch < '0' || ch > '9'){if (ch == '-')w = -1;ch = getchar();}while(ch >= '0' && ch <= '9')x = x * 10 + ch - '0', ch = getchar();return x * w;} //读入优化inline void write(int x){if (x < 0)putchar('-'), x = -x;if (x > 9)write(x / 10);putchar(x % 10 + '0');}//输出优化inline void spfa(int p){int i, x1, y1, x2, y2;for(head = 1; head <= tail; head ++){x1 = q[head][0], y1 = q[head][1];v[x1][y1] = false;for(i = 0; i < 4; i ++){x2 = x1 + g[i][0], y2 = y1 + g[i][1];if (x2 >= 0 && x2 < n && y2 >= 0 && y2 < m)if(f[p][x2][y2] > f[p][x1][y1] + a[x2][y2]){f[p][x2][y2] = f[p][x1][y1] + a[x2][y2];if (! v[x2][y2])v[x2][y2] = true, q[++ tail][0] = x2, q[tail][1] = y2;}}}}int main(){n = read(), m = read(), k = read();for(i = 0; i < n; i ++)for(j = 0; j < m; j ++){a[i][j] = read();ans += a[i][j];}memset(f, 0x3f, sizeof(f));for(i = 0; i < k; i ++){x = read(), y = read();f[1 << i][x][y] = a[x][y];}//读入&初始化 for(i = 1; i < (1 << k); i ++){tail = 0;for(x = 0; x < n; x ++)for(y = 0; y < m; y ++){for(j = 1; j <= i; j ++)if ((i & j) == j)f[i][x][y] = min(f[i][x][y], f[i - j][x][y] + f[j][x][y] - a[x][y]);if (f[i][x][y] != 0x3f3f3f3f)q[++ tail][0] = x, q[tail][1] = y, v[x][y] = true; }spfa(i);}//状压DPs = 0x3f3f3f3f;for(x = 0; x < n; x ++)for(y = 0; y < m; y ++)s = min(s, f[(1 << k) - 1][x][y]);ans -= s;write(ans);//比较并输出答案 return 0;}
新的一天~【女生每月必备的腰酸。。OTL。。太菜了吧。忽视它忽视它忽视它。。
【状压DP】【cofun1375】麦田相关推荐
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)
整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★
昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
- P2340 奶牛会展(状压dp)
P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...
- UVa 11825 (状压DP) Hackers' Crackdown
这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...
最新文章
- 马斯克:今年占全球发射质量65%,星舰5月或首次轨道试飞
- 【转】JAVA 接口
- Ext 整合 Jquery
- 【深度学习入门到精通系列】 深入浅出强化学习 Sarsa
- [xUnit]尝试单元测试
- Statement, PreparedStatement和CallableStatement的区别
- 动态规划训练11 [String painter HDU - 2476]
- FreeRTOS---堆内存管理(一)
- 负数比较大小_人教版六下【第一单元】负数比较负数的大小
- 知乎对「如何提问题?」的答案总结
- 面对 996,程序员如何利用“碎片时间”涨薪?
- 在线中文繁简体转换工具
- android 卡片收缩展开,jQuery和CSS3炫酷堆叠卡片展开和收缩特效
- Boxee智能电视机顶盒在美国CES亮相
- 【已解决】Ubuntu 12.04 LTS Source安装nodejs时出现bash ./configure permission denied
- C语言游戏开发——打飞机游戏1.0
- python毫秒级sleep
- 数据库设计4-概念结构设计
- 服务器自带软件怎么样卸载,告别卸载软件难 四大方法轻松搞定
- vue 使用Dialog对话框使用过程中出现灰色遮罩问题