可爱精灵宝贝 DP/爆搜
考崩了
T2
这题是个DP的好题啊(凡是我不会的都是好题,所以所有的题都是好题(雾))
DP思路:
分析性质:这个人对于路上的小精灵,能收集就一定会收集,即他每次都会收集这一段区间的小精灵
然后就考虑DP
设f[i][j][t]表示经过从i到j的区间最后停在i,最终时刻为t可以收获的最大价值
g[i][j][t]表示经过从i到j的区间最后停在j,最终时刻为t可以收获的最大价值。
一步步往外拓展,转移方程式太长了见代码
#include<bits/stdc++.h>
#define M 105
#define N 1005
using namespace std;
int f[M][M][N*],g[M][M][N*];
struct node{
int A,B,T;
}jl[M];
bool cmp(const node a,const node b)
{
return a.A<b.A||(a.A==b.A&&a.T<b.T);
}
int main()
{
memset(f,-0x3f,sizeof(f));
memset(g,-0x3f,sizeof(g));
int n,k,m,MAXT=,ans=;
scanf("%d%d%d",&n,&k,&m);
for(int i=;i<=m;i++)scanf("%d%d%d",&jl[i].A,&jl[i].B,&jl[i].T),MAXT=max(MAXT,jl[i].T);
jl[m+].A=k;jl[m+].B=;jl[m+].T=;
sort(jl+,jl+m+,cmp);
for(int i=;i<=m+;i++)
if(jl[i].A==k&&jl[i].B==)
{
f[i][i][]=g[i][i][]=;
break;
}
for(int t=;t<=MAXT;t++)
for(int i=;i<=m+;i++)
for(int j=i;j<=m+;j++)
{
ans=max(ans,max(g[i][j][t],f[i][j][t]));
f[i-][j][t+jl[i].A-jl[i-].A]=max(f[i][j][t]+(t+jl[i].A-jl[i-].A<=jl[i-].T?jl[i-].B:),f[i-][j][t+jl[i].A-jl[i-].A]);
f[i-][j][t+jl[j].A-jl[i-].A]=max(g[i][j][t]+(t+jl[j].A-jl[i-].A<=jl[i-].T?jl[i-].B:),f[i-][j][t+jl[j].A-jl[i-].A]);
g[i][j+][t+jl[j+].A-jl[i].A]=max(f[i][j][t]+(t+jl[j+].A-jl[i].A<=jl[j+].T?jl[j+].B:),g[i][j+][t+jl[j+].A-jl[i].A]);
g[i][j+][t+jl[j+].A-jl[j].A]=max(g[i][j][t]+(t+jl[j+].A-jl[j].A<=jl[j+].T?jl[j+].B:),g[i][j+][t+jl[j+].A-jl[j].A]);
}
cout<<ans<<endl;
return ;
}
DP 2000ms
这题可以用搜索过掉,而且跑的飞快。
主要是维护一个指针,及时筛掉不能去的点。
#include<bits/stdc++.h>
#define M 105
#define N 1005
using namespace std;
int ans=,MAXT,n,m,k,sum[M];
struct node{
int A,B,T;
}jl[M];
bool cmp(const node a,const node b){return a.A<b.A||(a.A==b.A&&a.T<b.T);}
void dfs(int now,int tim,int val,int tl,int tr)
{
if(val+sum[tl]+sum[m+]-sum[tr-]<ans)return ;//小剪枝
if(tim>MAXT)return ;
ans=max(ans,val); while(tl>=&&tim+jl[now].A-jl[tl].A>jl[tl].T)tl--;
while(tr<=m+&&tim+abs(jl[now].A-jl[tr].A)>jl[tr].T)tr++;//大剪枝 if(tl>=){
int tmp=tl;
dfs(tmp,tim+jl[now].A-jl[tmp].A,val+(tim+jl[now].A-jl[tmp].A<=jl[tmp].T)*jl[tmp].B,tl-,tr);
}
if(tr<=m+){
int tmp=tr;
dfs(tmp,tim+jl[tmp].A-jl[now].A,val+(tim+jl[tmp].A-jl[now].A<=jl[tmp].T)*jl[tmp].B,tl,tr+);
}
return ;
}
int main()
{
scanf("%d%d%d",&n,&k,&m);
for(int i=;i<=m;i++)scanf("%d%d%d",&jl[i].A,&jl[i].B,&jl[i].T),MAXT=max(MAXT,jl[i].T);
jl[m+].A=k;jl[m+].B=;jl[m+].T=;
sort(jl+,jl+m+,cmp);
for(int i=;i<=m+;i++)sum[i]=sum[i-]+jl[i].B;
for(int i=;i<=m+;i++)
if(jl[i].B==){
dfs(i,,,i-,i+);break;
}
cout<<ans<<endl;
return ;
}
搜索20ms
这个题对那些大佬来说是水题,但对我来说却不是。
我的考试思路:
这题显然DP啊,然后呢?抓住m比较小,先把坐标离散了,然后。。。。。。。。
然后我就不会了,打了个30分的状压,状压还没裸暴力分高=_=
1.注意思路的转化,多见一些题。
2.一条路走不通的时候,换一条路走走。
3.暴力大法好哇!!!!(注意优化)
可爱精灵宝贝 DP/爆搜的更多相关文章
- [jzoj 5770]【2018提高组模拟A组8.6】可爱精灵宝贝 (区间dp)
传送门 Description Branimirko是一个对可爱精灵宝贝十分痴迷的玩家.最近,他闲得没事组织了一场捉精灵的游戏.游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n. ...
- 可爱精灵宝贝:dp
拒绝听搜索.etc水过的.数据太弱了(尽管考场上我凭借数据太水骗了好多分) 我讲的思路和下发的题解一样.(因为我不会所以只能颓它啊) 首先你要相信这题精灵就100个,真的只有100个,这次数据范围没错 ...
- [CSP-S模拟测试]:可爱的精灵宝贝(搜索)
题目描述 $Branimirko$是一个对可爱精灵宝贝十分痴迷的玩家.最近,他闲得没事组织了一场捉精灵的游戏.游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由$1$到$n$.刚开始玩家在 ...
- 铺砖头问题(完美)——爆搜&&插头DP
题意 给定一个 $n \times m$ 的格子,每个格子被染成了黑色或白色.现在要用 $1 \times 2$ 的砖块覆盖这些格子,要求块与块之间互不重叠,且覆盖了所有白色的格子,但不覆盖任意黑色格 ...
- 51nod 1989 竞赛表格 (爆搜+DP算方案)
题意 自己看 分析 其实统计出现次数与出现在矩阵的那个位置无关.所以我们定义f(i)f(i)f(i)表示iii的出现次数.那么就有转移方程式f(i)=1+∑j+rev(j)=if(j)f(i)=1+\ ...
- BZOJ 1207: [HNOI2004]打鼹鼠【妥妥的n^2爆搜,dp】
1207: [HNOI2004]打鼹鼠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3259 Solved: 1564[Submit][Statu ...
- 【BZOJ-1853&2393】幸运数字&Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 1817 Solved: 665[Submit][Status] ...
- POJ 1166 The Clocks (爆搜 || 高斯消元)
题目链接 题意: 输入提供9个钟表的位置(钟表的位置只能是0点.3点.6点.9点,分别用0.1.2.3)表示.而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一.二.四 ...
- hdu 5025 Saving Tang Monk 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...
随机推荐
- python常用算法学习(3)
1,什么是算法的时间和空间复杂度 算法(Algorithm)是指用来操作数据,解决程序问题的一组方法,对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是在过程中消耗的资源和时间却会有很大 ...
- 从零开始的vue学习笔记(七)
前言 今天花一天时间阅读完vuex的官方文档,简单的做一下总结和记录 Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,以前的符合"单向数据流"理念的 ...
- 洛谷 1552 [APIO2012]派遣
题目背景 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 题目描述 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者都有且仅有一个上级.为保密 ...
- Java内存模型总结
Java内存模型 内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象,不同架构下的物理机拥有不一样的内存模型,Java虚拟机也有自己的内存模型,即Java内存模型(J ...
- Redis未授权访问写Webshell和公私钥认证获取root权限
0x01 什么是Redis未授权访问漏洞 Redis 默认情况下,会绑定在 0.0.0.0:,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服 ...
- 素数与Miller-Rabin测试
素数及其性质 素数又称质数.指整数在一个大于 111 的自然数中,除了 111 和此整数自身外,没法被其他自然数整除的数. 性质1 有无穷多个素数. 证明: 用反证法.设已知的最大素数为 PPP,考虑 ...
- C++中哪些函数不能声明为inline?
inline关键字仅仅是对编译器的建议,编译器有权力决定一个函数是否在调用处嵌入.因为内联函数要在调用处展开,编译器必须能在每一个调用处能看到该函数的定义,因此最好将函数实现放在头文件中(而且实现在类 ...
- bcache 状态/配置 文件详细介绍(翻译自官网)
声明: 文中 斜体带下划线 的段落为翻译不够准确的段落 原文:https://www.kernel.org/doc/Documentation/bcache.txt 官网:https://bcach ...
- 常用函数-String
/************************************************************************ 函数功能:将字符串中str的old_value子字符 ...
- python里怎么查看数据类型
python里怎么查看数据类型? python里可以通过type()函数来查看数据类型. Python 内置函数 Python 内置函数 Python type() 函数如果你只有第一个参数则返回对象 ...