传送门

Description

Branimirko是一个对可爱精灵宝贝十分痴迷的玩家。最近,他闲得没事组织了一场捉精灵的游戏。游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n。

刚开始玩家在k号房子前。有m个精灵,第i只精灵在第A[i]栋房子前,分值是B[i],以及它在T[i]秒内(含)存在,之后消失。Branimirko可以选择移动至相邻的房子,耗时1秒。抓住精灵不需要时间,精灵被抓住后消失。时间从第1秒开始。Branimirko能最多获得多少分值和。

Input

输入的第1行为三个正整数n,k,m。

接下来m行描述精灵的信息,分别为A[i],B[i],T[i]。

Output

输出Branimirko能最多获得多少分值和。

Sample Input

10 5 4

1 30 4

3 5 7

7 10 12

9 100 23

Sample Output

115

Data Constraint

20%的数据:m≤10

40%的数据:m≤20

k≤n≤1000,m≤100,A[i] ≤N,B[i] ≤100,T[i] ≤2000,所有数为正整数。

Hint

很遗憾,它恰好不能抓住在一号房子前的精灵。

如果T[1]改成5,答案就是145

Solution

设f[l][r][k]表示已经抓了l~r区间第k秒在左端点 g[l][r][k]在右端点

那么考虑四种情况转移到f[l][r][k]或g[l][r][k]

f(l+1,r)->f(l,r)

g(l+1,r)->f(l,r)

f(l,r-1)->g(l,r)

g(l,r-1)->g(l,r)

Code

//By Menteur_Hxy
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define M(a,b) memset(a,(b),sizeof(a))
#define F(i,a,b) for(i=(a);i<=(b);i++)
using namespace std; int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
} const int N=1010,M=110,T=2010;
int n,K,m,ans,INF;
int f[M][M][T],g[M][M][T],pl[M],da[M],en[M],val[T][N],vis[N],fla[N],id[M]; bool cmp(int x,int y) {return pl[x]<pl[y];} void print(int l,int r,int t) {
printf("f[%d][%d][%d]=%d\n",l,r,t,f[l][r][t]);
printf("g[%d][%d][%d]=%d\n",l,r,t,g[l][r][t]);
} signed main() {
freopen("go.in","r",stdin);
freopen("go.out","w",stdout);
n=read(),K=read(),m=read(); int i,j,k,l=0,r=0,tim;
F(i,1,m) pl[i]=read(),da[i]=read(),en[i]=read(),vis[pl[i]]=1,id[i]=i;
sort(id+1,id+1+m,cmp);
F(i,1,m) {
if(pl[id[i]]<=K&&en[id[i]]>=K-pl[id[i]]+1) l=id[i];
if(pl[id[i]]>K&&en[id[i]]>=pl[id[i]]-K+1) {r=id[i];break;}
}
if(l) f[l][l][K-pl[l]+1]=g[l][l][K-pl[l]+1]=da[l];
if(r) f[r][r][pl[r]-K+1]=g[r][r][pl[r]-K+1]=da[r];
// printf("f[%d][%d][%d]=%d\n",l,l,K-pl[l]+1,f[l][l][K-pl[l]+1]);
// printf("f[%d][%d][%d]=%d\n",r,r,pl[r]-K+1,f[r][r][pl[r]-K+1]);
// if(!ans) return puts("0"),0;
F(k,1,2000) {
F(i,1,m) F(j,i+1,m) {
l=id[i],r=id[j];
if(k>=(tim=pl[id[l+1]]-pl[l])&&f[id[l+1]][r][k-tim]) {
if(en[l]>=k) f[l][r][k]=max(f[l][r][k],f[id[l+1]][r][k-tim]+da[l]);
else f[l][r][k]=max(f[l][r][k],f[id[l+1]][r][k-tim]);
}
if(k>=(tim=pl[r]-pl[id[r-1]])&&g[l][id[r-1]][k-tim]) {
if(en[r]>=k) g[l][r][k]=max(g[l][r][k],g[l][id[r-1]][k-tim]+da[r]);
else g[l][r][k]=max(g[l][r][k],g[l][id[r-1]][k-tim]);
}
if(k>=(tim=pl[r]-pl[l])&&g[id[l+1]][r][k-tim]) {
if(en[l]>=k) f[l][r][k]=max(f[l][r][k],g[id[l+1]][r][k-tim]+da[l]);
else f[l][r][k]=max(f[l][r][k],g[id[l+1]][r][k-tim]);
}
if(k>=(tim=pl[r]-pl[l])&&f[l][id[r-1]][k-tim]) {
if(en[r]>=k) g[l][r][k]=max(g[l][r][k],f[l][id[r-1]][k-tim]+da[r]);
else g[l][r][k]=max(g[l][r][k],f[l][id[r-1]][k-tim]);
}
// if(f[l][r][k]||g[l][r][k]) print(l,r,k);
ans=max(ans,max(f[l][r][k],g[l][r][k]));
}
}
printf("%d",ans);
return 0;
}

[jzoj 5770]【2018提高组模拟A组8.6】可爱精灵宝贝 (区间dp)的更多相关文章

  1. JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会

    题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...

  2. 2018.10.27 loj#2292. 「THUSC 2016」成绩单(区间dp)

    传送门 g[i][j][k][l]g[i][j][k][l]g[i][j][k][l]表示将区间l,rl,rl,r变成最小值等于kkk,最大值等于lll时的花费的最优值. f[i][j]f[i][j] ...

  3. JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动

    5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms  ...

  4. JZOJ 5812. 【NOIP提高A组模拟2018.8.14】 区间

    5812. [NOIP提高A组模拟2018.8.14] 区间 (File IO): input:range.in output:range.out Time Limits: 1000 ms  Memo ...

  5. 5820. 【NOIP提高A组模拟2018.8.16】 非法输入(模拟,字符串)

    5820. [NOIP提高A组模拟2018.8.16] 非法输入 (File IO): input:aplusb.in output:aplusb.out Time Limits: 1000 ms   ...

  6. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

  7. JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠

    JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...

  8. 【NOIP2017提高A组模拟9.7】JZOJ 计数题

    [NOIP2017提高A组模拟9.7]JZOJ 计数题 题目 Description Input Output Sample Input 5 2 2 3 4 5 Sample Output 8 6 D ...

  9. JZOJ 100029. 【NOIP2017提高A组模拟7.8】陪审团

    100029. [NOIP2017提高A组模拟7.8]陪审团 Time Limits: 1000 ms  Memory Limits: 131072 KB  Detailed Limits   Got ...

随机推荐

  1. 目标跟踪学习系列十:Struck:Structured Output Tracking with Kernels 代码调试

    本来想看完代码再具体的写的.可是有人问了就先贴出来吧! 代码调试中会遇到的一些的问题. 首先,你没有代码的话能够在这里下载:http://download.csdn.net/detail/u01219 ...

  2. Android 聊天表情输入、表情翻页带效果、下拉刷新聊天记录

    经过一个星期的折腾,最终做完了这个Android 聊天表情输入.表情翻页带效果.下拉刷新聊天记录.这仅仅是一个单独聊天表情的输入,以及聊天的效果实现.由于我没有写server,所以没有两方聊天的效果. ...

  3. Unity3D中的Coroutine具体解释

    本文太乱,推荐frankjfwang的:全面解析Coroutine技术 Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这种代码. 疑问: yie ...

  4. android.os.Process.killProcess(android.os.Process.myPid())与Activity生命周期的影响

    如果通过finish方法结束了一个Activity,那么根据Activity的生命周期,则会自动调用Activity的销毁方法onDestory(),但是在项目中遇到这样的一个问题,就是​Activi ...

  5. linux下获取按键响应事件【转】

    本文转载自:https://my.oschina.net/u/157503/blog/91548 1.问题 通过一个死循环将读取键盘对应的设备文件将触发键盘事件在屏幕上打印出来,按esc退出程序 代码 ...

  6. 使用匿名类型做为ComboBox的DataSource

    使用匿名类型做为ComboBox的DataSource   ArrayList list = new ArrayList();            list.Add(new { id = " ...

  7. WebSocket在Asp.Net中的例子

    环境 以下代码环境要求:win8或win10, .net4.5+IIS8 部署到IIS8上面 转到 Windows程序和功能 -打开Windows功能里面 IIS选项启动4.5 和WebSocket支 ...

  8. B1934 [Shoi2007]Vote 善意的投票 最小割

    一开始不太会,结果看完题解就是一个建图的网络流.然后就结了. 题干: 题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人 ...

  9. leetcode二分查找相关

    目录 33/81搜索旋转排序数组 34在排序数组中查找元素的第一个和最后一个位置 35搜索插入位置 74搜索二维矩阵 300最长上升子序列,354俄罗斯套娃信封问题 33/81搜索旋转排序数组 假设按 ...

  10. Coursera Algorithms Programming Assignment 1: Percolation(100分)

    题目来源http://coursera.cs.princeton.edu/algs4/assignments/percolation.html 作业分为两部分:建立模型和仿真实验. 最关键的部分就是建 ...