洛谷 1052 dp 状态压缩
#洛谷1052 dp 状态压缩
传送门
(https://www.luogu.org/problem/show?pid=1052#sub)
做完这道题之后,感觉涨了好多见识,以前做的好多状压题目都是将一维压成一个数,一直感觉状压本质就是位运算来保存状态,这道题给了一个全新的思路,通过裁剪无用的状态来有效的减少状态量,从而使空间和时间达到要求
初看题目感觉还是挺简单的,但是1e9的使得线性dp无论空间还是时间都难以接受,考虑如何减少状态量
发现题目中石子的数量只有100个,而且每次跳跃的距离小于10,可见实际上桥上的石子排列应该非常稀疏,尝试从此处优化
不难发现如果两个石子之间的距离大于一定值时,它们的距离就将失去意义,

比如每次跳跃距离在(5,7),而某两个石子的距离为10000,那么将他们的距离调整为5000对结果无任何影响
优化距离之后直接进行dp转移即可,笔者选择了2 * t作为优化距离的分界线
dp[i] = min(dp[i-j], dp[i]) + (flag[i] == 1)
Warning:
对a数组进行修改操作时,不能对原数组进行修改,例如,a[1] = 1, a[2] = 300 , a[3] = 301,如果在原数组上进行修改,会导致a[2] 被修改为一个较小值,而a[3]此时也会符合修改条件,导致错解
初始化时要注意初始化的值,如果初始化值过大可能导致爆int上限
压缩时可能发生冲突,尤其是在s, t相对接近时,可以适当加大mod的值,同时在压缩两个较远点时适当增加压缩后的距离
#include <cstdio>
#include <algorithm>
#include <cstring>
int l, m, s, t;
const int maxn = 1000000 + 500;
int dp[maxn];
int a[maxn];
int d[maxn];
int cur[maxn];
int mod;
int main () {
freopen("river.in", "r", stdin);
freopen("river.out", "w", stdout);
scanf("%d %d %d %d", &l, &s, &t, &m);
for (int i = 1; i <= m; i++) scanf("%d", &a[i]);
mod = 2 * t;
std :: sort(&a[1], &a[m + 1]);
for (int i = 1; i <= m; i++) {
if (a[i] - a[i-1] <= mod) {
d[i] = a[i] - a[i-1];
} else {
d[i] = (a[i] - a[i-1]) % mod + mod;
}
}
// for (int i = 1; i <= m; i++) printf("%d ", a[i]);
// printf("\n");
int nowSum = 0;
for (int i = 1; i <= m; i++) {
nowSum += d[i];
cur[nowSum] = 1;
}
for (int i = 0; i <= maxn; i++) dp[i] = 1000000000;
if (l - nowSum > mod)
l = nowSum + mod + (l - nowSum) % mod;
dp[0] = 0;
for (int i = 0; i <= l; i++)
for (int j = s; j <= t; j++) {
dp[i+j] = std :: min(dp[i+j], dp[i] + cur[i+j]);
}
int ans = 0x7fffffff;
for (int j = l; j <= l + 2 * t; j++)
ans = std :: min(ans, dp[j]);
printf("%d", ans);
return 0;
}
洛谷 1052 dp 状态压缩的更多相关文章
- 洛谷1052(路径压缩后简单dp)
同POJ3744写法都是一样的. 距离太长无意义可以压缩,注意不是随便压的,想一想可以跟%T发生关系. #include <cstdio> #include <cctype> ...
- 洛谷 1373 dp 小a和uim之大逃离 良心题解
洛谷 1373 dp 这题还不算太难,,当初看的时候不是很理解题意,以为他们会选择两条不同的路径,导致整体思路混乱 传送门 其实理解题意和思路之后还是敲了不短的时间,一部分身体原因再加上中午休息不太好 ...
- 洛谷 1063 dp 区间dp
洛谷 1063 dp 区间dp 感觉做完这道提高组T1的题之后,受到了深深的碾压,,最近各种不在状态.. 初看这道题,不难发现它具有区间可并性,即(i, j)的最大值可以由(i, k) 与 (k+1, ...
- 洛谷 2409 dp 月赛题目
洛谷 2409 dp 洛谷十月月赛T1,一道有些interesting的dp题目,当时做的时候想的比较复杂,根本没有往dp的方向去想.. 非官方题解: 1.据说可以使用优先队列来处理,参见Uva119 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
- HDU 1074 Doing Homework (dp+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...
- hdu_4352_XHXJ's LIS(数位DP+状态压缩)
题目连接:hdu_4352_XHXJ's LIS 题意:这题花大篇篇幅来介绍电子科大的一个传奇学姐,最后几句话才是题意,这题意思就是给你一个LL范围内的区间,问你在这个区间内最长递增子序列长度恰为K的 ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【bzoj1076】[SCOI2008]奖励关 期望dp+状态压缩dp
题目描述 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再 ...
随机推荐
- Java多线程-锁的原理
锁升级: 无锁->偏向锁->轻量级锁->重量级锁 sychronized原理: wait/notify
- 【转】C# ArcgisEngine开发中,对一个图层进行过滤,只显示符合条件的要素
有时候,我们要对图层上的地物进行有选择性的显示,以此来满足实际的功能要求. 按下面介绍的方法可轻松实现图层属性过滤显示: 1.当图层已经加载时 private void ShowByFilter(Ax ...
- plsql解决64位解决办法
plsql解决64位解决办法 设置PLSQL Developer访问本机64位Oracle 由于在本机Windows Server 2008 R2 X64上安装了64位的Oracle 11.2.0.1 ...
- cocos2dx项目创建
射击类游戏文档 作者:浙江传媒学院 新媒体 张勇 1>编译环境 首先我们先去cocos2dx官网上下载cocos2dx最新版本号 http://www.cocos2d-x.org/ 我下载的 ...
- hdu5319 Painter(模拟)
题目链接:点击打开链接 题目大意:给一个矩形.有两把刷子,一把刷红色,一把刷蓝色,红色的方向是东南,蓝色的方向是西北,红色加蓝色等于绿色,如今已知这面墙当前的状态.求从白墙到这个状态最少刷了多少次. ...
- 学习ASP.NET MVC系列 - 还有比这更简炼的吗?把复杂的事情变简单了,贡献啊!
转自
- hdoj--1251--统计难题(字典树)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Subm ...
- 云:VMware
ylbtech-云:VMware VMware总部位于美国加州帕洛阿尔托 ,是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案,企业通过数据中心改造和公有云整合业务,借助企业安全转 ...
- springmvc-mvc:resource标签使用
转自:http://www.cnblogs.com/gzulmc/p/6746174.html <!-- 配置静态资源 --><mvc:resources location=&quo ...
- oracle RAC 11g sqlload 生产表导入数据(ORA-12899)
背景:由于即将来临的双十一,业务部门(我司是做京东,天猫的短信服务),短信入库慢,需要DBA把数据库sqlload进数据库. 表结构如下: MRS VARCHAR2(100), STATUS VARC ...