题意:


思路:
先预处理出所有格子的statement
statement=1–>只有上边的格子被覆盖
statement=2–>只有下边的格子被覆盖
statement=3–>上下都被覆盖

f[i][j][k]表示状态为i时,前j个地方的奶牛,盖k座房子 最少盖住的格子

i有四种情况

  • i=1代表只有上边的格子被覆盖
  • i=2代表只有下边的格子被覆盖
  • i=3代表上下被同一个房子覆盖
  • i=4代表上下被不同房子覆盖

    状态转移很麻烦 特别麻烦

  • statement=1时

f[1][j][k]=min(min(f[1][j-1][k-1],min(f[2][j-1][k-1],min(f[3][j-1][k-1],f[4][j-1][k-1])))+1,f[1][j-1][k]+node[j].pos-node[j-1].pos);
f[1][j][k]=min(f[1][j][k],f[4][j-1][k]+node[j].pos-node[j-1].pos);
f[3][j][k]=min(temp+2,f[3][j-1][k]+2*(node[j].pos-node[j-1].pos));
f[4][j][k]=f[4][j-1][k]+2*(node[j].pos-node[j-1].pos);
f[4][j][k]=min(f[4][j][k],f[1][j-1][k-1]+node[j].pos-node[j-1].pos+1);
f[4][j][k]=min(f[4][j][k],f[2][j-1][k-1]+node[j].pos-node[j-1].pos+1);

  • statement=2时同理
  • statement=3时

int temp=min(f[1][j-1][k-1],min(f[2][j-1][k-1],min(f[3][j-1][k-1],f[4][j-1][k-1])));
f[3][j][k]=min(temp+2,f[3][j-1][k]+2*(node[j].pos-node[j-1].pos));
if(k>1)f[4][j][k]=min(f[1][j-1][k-2],min(f[2][j-1][k-2],min(f[3][j-1][k-2],f[4][j-1][k-2])))+2;
f[4][j][k]=min(f[4][j][k],f[4][j-1][k]+2*(node[j].pos-node[j-1].pos));
f[4][j][k]=min(f[4][j][k],f[1][j-1][k-1]+node[j].pos-node[j-1].pos+1);
f[4][j][k]=min(f[4][j][k],f[2][j-1][k-1]+node[j].pos-node[j-1].pos+1);

最后代码如下:

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,K,b,cnt,f[5][1005][1005];
struct Node{int sta,pos;}node[1005];
bool cmp(Node a,Node b){return a.pos<b.pos;
}
int main(){scanf("%d%d%d",&n,&K,&b);for(int i=1;i<=n;i++)scanf("%d%d",&node[i].sta,&node[i].pos);sort(node+1,node+1+n,cmp);for(int i=1;i<=n;i++){if(node[i].pos==node[i-1].pos)node[cnt].sta=3;else node[++cnt]=node[i];}node[0].pos=node[1].pos;memset(f,0x3f,sizeof(f));f[1][0][1]=f[2][0][1]=1,f[3][0][1]=f[4][0][2]=2;for(int i=1;i<=4;i++){for(int j=1;j<=cnt;j++){for(int k=K;k;k--){if(node[j].sta==1){int temp=min(f[1][j-1][k-1],min(f[2][j-1][k-1],min(f[3][j-1][k-1],f[4][j-1][k-1])));f[1][j][k]=min(temp+1,f[1][j-1][k]+node[j].pos-node[j-1].pos);f[1][j][k]=min(f[1][j][k],f[4][j-1][k]+node[j].pos-node[j-1].pos);f[3][j][k]=min(temp+2,f[3][j-1][k]+2*(node[j].pos-node[j-1].pos));f[4][j][k]=f[4][j-1][k]+2*(node[j].pos-node[j-1].pos);f[4][j][k]=min(f[4][j][k],f[1][j-1][k-1]+node[j].pos-node[j-1].pos+1);f[4][j][k]=min(f[4][j][k],f[2][j-1][k-1]+node[j].pos-node[j-1].pos+1);}else if(node[j].sta==2){int temp=min(f[1][j-1][k-1],min(f[2][j-1][k-1],min(f[3][j-1][k-1],f[4][j-1][k-1])));f[2][j][k]=min(temp+1,f[2][j-1][k]+node[j].pos-node[j-1].pos);f[2][j][k]=min(f[2][j][k],f[4][j-1][k]+node[j].pos-node[j-1].pos);f[3][j][k]=min(temp+2,f[3][j-1][k]+2*(node[j].pos-node[j-1].pos));f[4][j][k]=f[4][j-1][k]+2*(node[j].pos-node[j-1].pos);f[4][j][k]=min(f[4][j][k],f[1][j-1][k-1]+node[j].pos-node[j-1].pos+1);f[4][j][k]=min(f[4][j][k],f[2][j-1][k-1]+node[j].pos-node[j-1].pos+1);}else{int temp=min(f[1][j-1][k-1],min(f[2][j-1][k-1],min(f[3][j-1][k-1],f[4][j-1][k-1])));f[3][j][k]=min(temp+2,f[3][j-1][k]+2*(node[j].pos-node[j-1].pos));if(k>1)f[4][j][k]=min(f[1][j-1][k-2],min(f[2][j-1][k-2],min(f[3][j-1][k-2],f[4][j-1][k-2])))+2;f[4][j][k]=min(f[4][j][k],f[4][j-1][k]+2*(node[j].pos-node[j-1].pos));f[4][j][k]=min(f[4][j][k],f[1][j-1][k-1]+node[j].pos-node[j-1].pos+1);f[4][j][k]=min(f[4][j][k],f[2][j-1][k-1]+node[j].pos-node[j-1].pos+1);}}}}for(int i=1;i<=4;i++)f[1][cnt][K]=min(f[1][cnt][K],f[i][cnt][K]);printf("%d\n",f[1][cnt][K]);
}

转载于:https://www.cnblogs.com/SiriusRen/p/6532227.html

POJ 2430 状压DP相关推荐

  1. poj 1185(状压dp)

    题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...

  2. poj 3254 状压dp

    E - Corn Fields Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  3. Corn Fields(POJ 3254状压dp)

    题意: n*m网格1能放0不能放 放的格子不能相邻 求一共多少种可放的方案. 分析: dp[i][j]第i行可行状态j的的最大方案数,枚举当前行和前一行的所有状态转移就行了(不放牛也算一种情况) #i ...

  4. Travel(HDU 4284状压dp)

    题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...

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

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

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

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

  7. 【POJ 3311】Hie with the Pie(状压DP)

    Hie with the Pie 题目链接:POJ 3311 题目大意 给你 n+1 个点,其中 0 号点是特殊点. 然后两个点之间都有路径可以走. 然后你要从特殊点出发走过所有点回到特殊点,问你最短 ...

  8. POJ 1185 炮兵阵地 【状压DP】

    <题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  9. POJ 1321 棋盘问题(DFS 状压DP)

    用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...

最新文章

  1. a连接带id转送不了数据_你找到了数据清洗利器?
  2. Beta冲刺随笔集合
  3. Bing地图REST服务
  4. 一个合格的web前端程序员要学会哪些技能?
  5. JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后 1
  6. 蒙特卡洛法求圆周率100亿数据
  7. 解决a different object with the same identifier value was already associated with the session错误...
  8. 标准炮灰三人组飞鸽传书武侠片
  9. ARM汇编指令格式及规则
  10. Teamcity+SVN+VisualStudio在持续集成简明教程
  11. 关于webpack4的14个知识点,童叟无欺
  12. Tiktok引流到独立站?
  13. 海航通信启动通信+大数据战略 海航宽带首次发布
  14. Pr 视频效果:颜色校正
  15. win10电脑性能测试软件,win10系统测试计算机性能的图文方法
  16. Mysql索引:图文并茂,深入探究索引的原理和使用
  17. I2C协议研读(九):十位寻址
  18. vue2.0中的路由传值
  19. JavaWeb图书商城 网上书城
  20. e.getMessage()

热门文章

  1. 关于某日访问次数最多的IP的topK问题的三种解法
  2. 深度学习学习指南-工具篇
  3. Ubuntu更换阿里源以及由于没有公钥,无法验证下列签名错误
  4. System.FormatException:“输入字符串的格式不正确。”
  5. torch.backends.cudnn.deterministic 使用cuda保证每次结果一样
  6. tensorflow学习笔记(二十五):ConfigProtoGPU
  7. 万事开头难!最新MyBatis程序配置教程(IDEA版)
  8. NVIDIA TensorRT高性能深度学习推理
  9. 队列:实用程序服务和数据结构
  10. 用Microsoft DirectX光线跟踪改善渲染质量