考崩了

T2

这题是个DP的好题啊(凡是我不会的都是好题,所以所有的题都是好题(雾))

DP思路:

分析性质:这个人对于路上的小精灵,能收集就一定会收集,即他每次都会收集这一段区间的小精灵

然后就考虑DP

设f[i][j][t]表示经过从i到j的区间最后停在i,最终时刻为t可以收获的最大价值

g[i][j][t]表示经过从i到j的区间最后停在j,最终时刻为t可以收获的最大价值。

一步步往外拓展,转移方程式太长了见代码

 1 #include<bits/stdc++.h>
 2 #define M 105
 3 #define N 1005
 4 using namespace std;
 5 int f[M][M][N*2],g[M][M][N*2];
 6 struct node{
 7     int A,B,T;
 8 }jl[M];
 9 bool cmp(const node a,const node b)
10 {
11     return a.A<b.A||(a.A==b.A&&a.T<b.T);
12 }
13 int main()
14 {
15     memset(f,-0x3f,sizeof(f));
16     memset(g,-0x3f,sizeof(g));
17     int n,k,m,MAXT=0,ans=0;
18     scanf("%d%d%d",&n,&k,&m);
19     for(int i=1;i<=m;i++)scanf("%d%d%d",&jl[i].A,&jl[i].B,&jl[i].T),MAXT=max(MAXT,jl[i].T);
20     jl[m+1].A=k;jl[m+1].B=0;jl[m+1].T=0;
21     sort(jl+1,jl+m+2,cmp);
22     for(int i=1;i<=m+1;i++)
23         if(jl[i].A==k&&jl[i].B==0)
24         {
25             f[i][i][1]=g[i][i][1]=0;
26             break;
27         }
28     for(int t=1;t<=MAXT;t++)
29         for(int i=1;i<=m+1;i++)
30             for(int j=i;j<=m+1;j++)
31             {
32                 ans=max(ans,max(g[i][j][t],f[i][j][t]));
33                 f[i-1][j][t+jl[i].A-jl[i-1].A]=max(f[i][j][t]+(t+jl[i].A-jl[i-1].A<=jl[i-1].T?jl[i-1].B:0),f[i-1][j][t+jl[i].A-jl[i-1].A]);
34                 f[i-1][j][t+jl[j].A-jl[i-1].A]=max(g[i][j][t]+(t+jl[j].A-jl[i-1].A<=jl[i-1].T?jl[i-1].B:0),f[i-1][j][t+jl[j].A-jl[i-1].A]);
35                 g[i][j+1][t+jl[j+1].A-jl[i].A]=max(f[i][j][t]+(t+jl[j+1].A-jl[i].A<=jl[j+1].T?jl[j+1].B:0),g[i][j+1][t+jl[j+1].A-jl[i].A]);
36                 g[i][j+1][t+jl[j+1].A-jl[j].A]=max(g[i][j][t]+(t+jl[j+1].A-jl[j].A<=jl[j+1].T?jl[j+1].B:0),g[i][j+1][t+jl[j+1].A-jl[j].A]);
37             }
38     cout<<ans<<endl;
39     return 0;
40 }

DP 2000ms

这题可以用搜索过掉,而且跑的飞快。

主要是维护一个指针,及时筛掉不能去的点。

 1 #include<bits/stdc++.h>
 2 #define M 105
 3 #define N 1005
 4 using namespace std;
 5 int ans=0,MAXT,n,m,k,sum[M];
 6 struct node{
 7     int A,B,T;
 8 }jl[M];
 9 bool cmp(const node a,const node b){return a.A<b.A||(a.A==b.A&&a.T<b.T);}
10 void dfs(int now,int tim,int val,int tl,int tr)
11 {
12     if(val+sum[tl]+sum[m+1]-sum[tr-1]<ans)return ;//小剪枝
13     if(tim>MAXT)return ;
14     ans=max(ans,val);
15
16     while(tl>=1&&tim+jl[now].A-jl[tl].A>jl[tl].T)tl--;
17     while(tr<=m+1&&tim+abs(jl[now].A-jl[tr].A)>jl[tr].T)tr++;//大剪枝
18
19     if(tl>=1){
20         int tmp=tl;
21         dfs(tmp,tim+jl[now].A-jl[tmp].A,val+(tim+jl[now].A-jl[tmp].A<=jl[tmp].T)*jl[tmp].B,tl-1,tr);
22     }
23     if(tr<=m+1){
24         int tmp=tr;
25         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+1);
26         }
27     return ;
28 }
29 int main()
30 {
31     scanf("%d%d%d",&n,&k,&m);
32     for(int i=1;i<=m;i++)scanf("%d%d%d",&jl[i].A,&jl[i].B,&jl[i].T),MAXT=max(MAXT,jl[i].T);
33     jl[m+1].A=k;jl[m+1].B=0;jl[m+1].T=0;
34     sort(jl+1,jl+m+2,cmp);
35     for(int i=1;i<=m+1;i++)sum[i]=sum[i-1]+jl[i].B;
36     for(int i=1;i<=m+1;i++)
37         if(jl[i].B==0){
38             dfs(i,1,0,i-1,i+1);break;
39         }
40     cout<<ans<<endl;
41     return 0;
42 }

搜索20ms

这个题对那些大佬来说是水题,但对我来说却不是。

我的考试思路:

这题显然DP啊,然后呢?抓住m比较小,先把坐标离散了,然后。。。。。。。。

然后我就不会了,打了个30分的状压,状压还没裸暴力分高=_=

1.注意思路的转化,多见一些题。

2.一条路走不通的时候,换一条路走走。

3.暴力大法好哇!!!!(注意优化)

转载于:https://www.cnblogs.com/hzoi-kx/p/11342001.html

可爱精灵宝贝 DP/爆搜相关推荐

  1. 神奇宝贝计算机游戏程序设计,精灵宝贝神奇宝贝

    精灵宝贝神奇宝贝游戏,一款非常好玩的奇幻冒险类游戏,在这个热血世界中,体验一场无比精彩的激斗冒险,每一位玩家都将会成为一名强力的战士,开启一场场精彩无比的交锋过程,所以感兴趣的朋友们还在等什么呢,快来 ...

  2. 容斥 + 爆搜打表 ---- 2020年南京icpc H.Harmonious Rectangle

    题目链接 题目大意: 就是给你一个二维平面{(x,y)∣1≤x≤n,1≤y≤m}\{(x,y)|1\leq x\leq n,1\leq y \leq m\}{(x,y)∣1≤x≤n,1≤y≤m},你现 ...

  3. 1103 Integer Factorization (30 分)【难度: 中 / 爆搜】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224 爆搜的做法,动态规划也可以做,有时间也一个动 ...

  4. 1096 Consecutive Factors (20 分)【难度: 一般 / 爆搜 数论】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805370650738688 注意测试点1: 72=2*3*3*4 我这里 ...

  5. P2668 斗地主 dp+深搜版

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  6. UVA 2474 - Balloons in a Box 爆搜

    2474 - Balloons in a Box 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&a ...

  7. POJ 1166 The Clocks (爆搜 || 高斯消元)

    题目链接 题意: 输入提供9个钟表的位置(钟表的位置只能是0点.3点.6点.9点,分别用0.1.2.3)表示.而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一.二.四 ...

  8. hdu 5031 Lines 爆搜

    事实上嘞,这个线能够仅仅延伸一端 然后嘞,爆搜一次就能够 最后嘞,600-800ms过 本弱就是弱啊.你来打我呀-- #include<iostream> #include<cstr ...

  9. 【BZOJ-18532393】幸运数字Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 1817  Solved: 665 [Submit][Statu ...

  10. 题解HDU6148 Valley Numer(数位DP+深搜DFS)

    题解HDU6148 Valley Numer[数位DP+深搜DFS] 题目 解析 参考源码 题目 Description: 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Nu ...

最新文章

  1. 【Verilog HDL 训练】第 14 天(glitch-free的两个时钟切换电路)
  2. ‘str‘ object has no attribute ‘get‘ 错误解决方案
  3. boost::integer::extended_euclidean用法的测试程序
  4. Java volatile关键字原理解剖
  5. gitlab 构建tag_GitLab常用命令 分支 Tag 配置 操作
  6. C# 中 System.Range 结构体
  7. 原生js系列之DOM工厂模式
  8. Find Minimum in Rotated Sorted Array
  9. 机器人弹古筝图片_古筝维修:40年的牡丹牌古筝,动了个外科手术
  10. 微信小程序云开发实战:网上商城(二)
  11. 各位大神,有没有类似于百度云软件开始时的设置向导的例子呀
  12. Git学习笔记之三:Git 工作区、暂存区和版本库
  13. 【无关技术·朋友圈朝花朝拾】月相
  14. EasyPoi导出Excel实现标记颜色
  15. 安卓一键清理内存_安卓的手机内存清理来啦……
  16. [导入]《玫瑰人生》【第80届奥斯卡获奖大片】【DVD中英字幕】【14:50发布】
  17. Linux中alias永久更改命令别名
  18. 对激光原理的初步了解
  19. SSH 连接工具 xshell - 业界最强大的 SSH 客户端、Linux 远程连接工具
  20. php学生选课系统mysql

热门文章

  1. 【Burp suite】intruder内的四种攻击模式(attack type)分析!
  2. [SSL_CHX][2021-8-18]量身高
  3. 华为HCNA网络工程师【从入门到精通】自学视频[肖哥]-肖宗鹏-专题视频课程
  4. 货币等额换算_换算单位和货币的最佳免费程序和网站
  5. 关注虚拟财富“.ME”域名的投资价值
  6. datetime的时值
  7. 【吐槽】Android 第一步,雀氏纸尿裤
  8. VS2010扩展VAX的安装使用
  9. Opencv学习笔记 常用函数、基础知识二
  10. hdu6638 Snowy Smile (最大权值和矩阵、线段树)