【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】麦田相关推荐

  1. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  2. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  3. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  4. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  5. 【每日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 ...

  6. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  7. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

  8. P2340 奶牛会展(状压dp)

    P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...

  9. UVa 11825 (状压DP) Hackers' Crackdown

    这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...

最新文章

  1. 马斯克:今年占全球发射质量65%,星舰5月或首次轨道试飞
  2. 【转】JAVA 接口
  3. Ext 整合 Jquery
  4. 【深度学习入门到精通系列】 深入浅出强化学习 Sarsa
  5. [xUnit]尝试单元测试
  6. Statement, PreparedStatement和CallableStatement的区别
  7. 动态规划训练11 [String painter HDU - 2476]
  8. FreeRTOS---堆内存管理(一)
  9. 负数比较大小_人教版六下【第一单元】负数比较负数的大小
  10. 知乎对「如何提问题?」的答案总结
  11. 面对 996,程序员如何利用“碎片时间”涨薪?
  12. 在线中文繁简体转换工具
  13. android 卡片收缩展开,jQuery和CSS3炫酷堆叠卡片展开和收缩特效
  14. Boxee智能电视机顶盒在美国CES亮相
  15. 【已解决】Ubuntu 12.04 LTS Source安装nodejs时出现bash ./configure permission denied
  16. C语言游戏开发——打飞机游戏1.0
  17. python毫秒级sleep
  18. 数据库设计4-概念结构设计
  19. 服务器自带软件怎么样卸载,告别卸载软件难 四大方法轻松搞定
  20. vue 使用Dialog对话框使用过程中出现灰色遮罩问题

热门文章

  1. IDEA 2019 以后SVN 不能添加.ignore 解决办法
  2. 基于MATLAB对系统的串联滞后校正
  3. 我的Java后端书单1.0
  4. 用jmeter压测tcp
  5. rasp agent_Rasp Pi上的Perf机器学习
  6. 难道没有GPHONE??
  7. 去除chrome自动填充黄底样式
  8. thinking php 教程,Thinkphp基础教程
  9. java 事件流_JDK14的新特性:JFR,JMC和JFR事件流
  10. 申请鸿蒙内测一直没有审核,大家看看自己的鸿蒙内测申请还在不在?