POJ 2430 状压DP
题意:
思路:
先预处理出所有格子的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相关推荐
- poj 1185(状压dp)
题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...
- poj 3254 状压dp
E - Corn Fields Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- Corn Fields(POJ 3254状压dp)
题意: n*m网格1能放0不能放 放的格子不能相邻 求一共多少种可放的方案. 分析: dp[i][j]第i行可行状态j的的最大方案数,枚举当前行和前一行的所有状态转移就行了(不放牛也算一种情况) #i ...
- Travel(HDU 4284状压dp)
题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- 【POJ 3311】Hie with the Pie(状压DP)
Hie with the Pie 题目链接:POJ 3311 题目大意 给你 n+1 个点,其中 0 号点是特殊点. 然后两个点之间都有路径可以走. 然后你要从特殊点出发走过所有点回到特殊点,问你最短 ...
- POJ 1185 炮兵阵地 【状压DP】
<题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- POJ 1321 棋盘问题(DFS 状压DP)
用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...
最新文章
- a连接带id转送不了数据_你找到了数据清洗利器?
- Beta冲刺随笔集合
- Bing地图REST服务
- 一个合格的web前端程序员要学会哪些技能?
- JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后 1
- 蒙特卡洛法求圆周率100亿数据
- 解决a different object with the same identifier value was already associated with the session错误...
- 标准炮灰三人组飞鸽传书武侠片
- ARM汇编指令格式及规则
- Teamcity+SVN+VisualStudio在持续集成简明教程
- 关于webpack4的14个知识点,童叟无欺
- Tiktok引流到独立站?
- 海航通信启动通信+大数据战略 海航宽带首次发布
- Pr 视频效果:颜色校正
- win10电脑性能测试软件,win10系统测试计算机性能的图文方法
- Mysql索引:图文并茂,深入探究索引的原理和使用
- I2C协议研读(九):十位寻址
- vue2.0中的路由传值
- JavaWeb图书商城 网上书城
- e.getMessage()
热门文章
- 关于某日访问次数最多的IP的topK问题的三种解法
- 深度学习学习指南-工具篇
- Ubuntu更换阿里源以及由于没有公钥,无法验证下列签名错误
- System.FormatException:“输入字符串的格式不正确。”
- torch.backends.cudnn.deterministic 使用cuda保证每次结果一样
- tensorflow学习笔记(二十五):ConfigProtoGPU
- 万事开头难!最新MyBatis程序配置教程(IDEA版)
- NVIDIA TensorRT高性能深度学习推理
- 队列:实用程序服务和数据结构
- 用Microsoft DirectX光线跟踪改善渲染质量