[大山中学dp常练-4 Rounds]
Round#1 2016.9.28
这次晚练十分sb 有点浪费时间 全是dp题
先说过程 3分钟草了第一题之后感觉好像有点水 然后翻了翻题目 看了看第一第四题两颗星 其他三颗星 然后一下子第二题题目太长就兴起草第三题 打了四十五分钟然后草第二题 然后就没了要收卷(第二题还没调完 给多我五分钟就A了) 整体用了一个半小时吧(马力有点弱..)
三维dp 你也可以变成N和K的dp只是麻烦一点 这题不会可以退役
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define Maxn 1010
using namespace std;
int F[Maxn][][]; int T[Maxn];
int main()
{
freopen("bcatch.in","r",stdin);
freopen("bcatch.out","w",stdout);
int N,K; scanf("%d%d",&N,&K); for(int i=;i<=N;i++) scanf("%d",&T[i]);
for(int i=;i<=N;i++)
{
for(int j=;j<=K;j++)
{
F[i][j][]=max(F[i][j][],max(F[i-][j][],F[i-][j-][])+(T[i]==));
F[i][j][]=max(F[i][j][],max(F[i-][j][],F[i-][j-][])+(T[i]==));
}
}
int maxx=;
for(int i=;i<=K;i++) for(int j=;j<=;j++) maxx=max(maxx,F[N][i][j]);
return printf("%d\n",maxx),;
}
/*
7
2
1
1
2
2
1
1
*/
第二题题目很烦 条件很多 我们发现斜坡是越短越好 然后用时间和能力值dp一下随便草就好了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
struct Course
{
int m,l,a;
}C[];
bool Cmp(const Course &x,const Course &y){return x.m<y.m;}
struct XP
{
int c,d;
}X[];
int T,S,N;
int F[][]; int L[];
int main()
{
freopen("ski.in","r",stdin);
freopen("ski.out","w",stdout);
scanf("%d%d%d",&T,&S,&N);
for(int i=;i<=S;i++) scanf("%d%d%d",&C[i].m,&C[i].l,&C[i].a);
sort(C+,C+S+,Cmp);
for(int i=;i<=N;i++) scanf("%d%d",&X[i].c,&X[i].d); for(int i=;i<=;i++) L[i]=;
for(int i=;i<=N;i++) L[X[i].c]=min(L[X[i].c],X[i].d);
for(int i=;i<=;i++) L[i]=min(L[i],L[i-]); for(int i=;i<=T;i++) for(int j=;j<=;j++) F[i][j]=-;
F[][]=; int l=; int r=;
for(int i=;i<=T;i++)
{
while(C[r].m==i) r++;
for(int j=;j<=;j++)
{
if(F[i][j]!=-)
{
F[i+][j]=max(F[i+][j],F[i][j]);
if(i+L[j]<=T) F[i+L[j]][j]=max(F[i+L[j]][j],F[i][j]+);
for(int k=l;k<r;k++) if(i+C[k].l<=T) F[i+C[k].l][C[k].a]=max(F[i+C[k].l][C[k].a],F[i][j]);
}
}
l=r;
}
int maxx=;
for(int i=;i<=T;i++) for(int j=;j<=;j++) maxx=max(maxx,F[i][j]);
return printf("%d\n",maxx),;
}
/*
10 1 2
3 2 5
4 1
1 3
*/
第三题也想了一会儿 我们发现有一些状态我们是一定到不了的 就好比
7 3
8 5
其实8的时候最多为4 就改一下 还有一种
7 3
8 1
那么你7是要改成2的
先从后面扫一遍 然后前面再扫一遍到后面(先后顺序不知道可不可以换 应该可以吧 考场上没多想)
剩下的话都是可以到的 然后每次都到这个速度就是最优的因为你如果合法 但是又小于这个速度就是最差的 那么的话每两个点之间你就把它们先升到一个高度然后再往上飞最长的一段再下来
最后还要判断一下到终点 (就这样没了两个点)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define Maxn 100010
using namespace std;
bool Cmp(const pair<int,int> &x,const pair<int,int> &y){if(x.first!=y.first) return x.first<y.first; return x.second>y.second;}
int L,M; pair<int,int>pr[Maxn];
int F[Maxn];
int main()
{
freopen("bobsled.in","r",stdin);
freopen("bobsled.out","w",stdout);
scanf("%d%d",&L,&M); for(int i=;i<=M;i++) scanf("%d%d",&pr[i].first,&pr[i].second);
sort(pr+,pr+M+,Cmp); memset(F,,sizeof(F)); F[]=;
for(int i=;i<=M;i++) F[i]=min(F[i],pr[i].second);
for(int i=M;i>=;i--)
{
if(pr[i].first!=pr[i+].first)
{
F[i]=min(F[i],F[i]+(F[i+]-F[i])+(pr[i+].first-pr[i].first));
}
else F[i]=F[i+];
} int l;
for(int i=;i<=M;i=l+)
{
l=i; while(pr[l].first==pr[l+].first) l++;
if(pr[l].first!=pr[i-].first)
{
F[l]=min(F[l],F[l]+((F[i-]-F[l])+(pr[l].first-pr[i-].first)));
}
for(int j=i;j<=l;j++) F[j]=F[l];
} int ans=;
for(int i=;i<=M;i++) ans=max(ans,max(F[i],F[i-])+(pr[i].first-pr[i-].first-abs(F[i]-F[i-]))/);
ans=max(ans,F[M]+(L-pr[M].first));
return printf("%d\n",ans),;
} /*
14 3
7 3
11 1
13 8
*/
看看范围 好像直接背包会爆 很明显这道题给出来的做法一定是NM 然后想想背包可不可以换种方式
看到都是M的倍数 也就是说 M以上的都可以变成小于M咯 其它也要保留一下 然后F[N][i]表示现在放到第I个物品 然后M的倍数+i 然后再用一个数组辅助转移搞一下就好了 差不多绕圈的dp
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define Maxn 2010
using namespace std;
const int Mod=1e8;
int N,M; int A[Maxn]; int F[Maxn]; bool bo[Maxn]; int G[Maxn];
int main()
{
freopen("fristeam.in","r",stdin);
freopen("fristeam.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=;i<=N;i++) scanf("%d",&A[i]);
memset(F,,sizeof(F)); F[]=; memset(G,,sizeof(G)); memset(bo,,sizeof(bo)); bo[]=;
for(int i=;i<=N;i++)
{
for(int j=;j<M;j++) G[j]=;
for(int j=;j<M;j++)
if(bo[j]) G[(j+A[i])%M]=(G[(j+A[i])%M]+F[j])%Mod,bo[(j+A[i])%M]=;
for(int j=;j<M;j++)
if(bo[j]) F[j]=(F[j]+G[j])%Mod;
}
return printf("%d\n",F[]-),;
}
/*
4 5
1
2
8
2
*/
Round #2 2016.9.29
这次题目好像上了点难度,有点意思了
第一题考场上看错题意 以为中间有一个高的就不能跨过去 其它都可以..
当我back回的时候 才发现那条线要是直的 所以的话用斜率搞一下 画画图 很容易把O(N^3)变成O(N^2)
有空再更..
[大山中学dp常练-4 Rounds]的更多相关文章
- 10-19 dp专练
dp专练,终于克服了一次自己对dp的恐惧,磕出来一道题. 得分情况: T1:0 T2:0 T3:0 emmmm,磕出来的题是T2,但是因为初始化和int long long的原因爆零了 T1:n只狼排 ...
- 记502 dp专练
趁着503的清早 我还算清醒把昨天老师讲的内容总结一下,昨天有点迷了 至使我A的几道题都迷迷糊糊的.(可能是我太菜了) 这道题显然是 数字三角形的变形 好没有经过认真思考然后直接暴力了 这是很不应该的 ...
- 数位dp小练
最近刷题的同时还得填填坑,说来你们也不信,我还不会数位dp. 照例推几篇博客: 数位DP讲解 数位dp 的简单入门 这两篇博客讲的都很好,不过代码推荐记搜的形式,不仅易于理解,还短. 数位dp的式子一 ...
- dp专练
dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...
- 【树形dp小练】HDU1520 HDU2196 HDU1561 HDU3534
[树形dp]就是在树上做的一些dp之类的递推,由于一般须要递归处理.因此平庸情况的处理可能须要理清思路.昨晚開始切了4题,作为入门训练.题目都很easy.可是似乎做起来都还口以- hdu1520 An ...
- DP 专练
A - 跳蚤电话 观察性质,可以发现每次连边的点一定是有祖先关系的,可以直接挂上去一个,也可以是在中间边上插入一个点. 所以我很自然的想到去计算树上的点的加入顺序,因为一但加入顺序确定,每一次的操作也 ...
- <python练习题>python练习题(常练勿忘)
学了python,去面试经常出现,某个或某些库不熟悉导则想不起来怎么写,知道思路而写不出来,多半还是不够熟悉,这里就作为熟悉python的地方,多做做题,多思考. 题目1:店铺ID为00000000- ...
- 开坑数位dp
[背景] 在10月3日的dp专练中,压轴的第6题是一道数位dp,于是各种懵逼. 为了填上这个留存已久的坑,蒟蒻chty只能开坑数位dp了. [例题一][HDU2089]不要62 题目大意:给你一个区间 ...
- 【HDU3507】Print Article(斜率优化DP)
单调队列DP复出练手题 朴素方程dp[i]=min(dp[j]+(s[i]-s[j-1])^2+m 你懂得 ..]of int64; a,q:array[..]of longint; n,m,i,t, ...
随机推荐
- HP quality center 9.0 邮件设置
[转载]HP quality center 9.0 邮件设置 (2010-09-20 10:28:03) 转载▼ 标签: 转载 原文地址:HP quality center 9.0 邮件设置作者: ...
- RabbitMq install on Centos6.3
安装服务(root) step 1: 启用EPEL:EPEL是一个Fedora Project 推出的 EPEL(Extra Packages for Enterprise Linux),EPEL是 ...
- 数据访问层的改进以及测试DOM的发布
数据访问层的改进以及测试DOM的发布 在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层 ...
- javascript设计模式系列
javascript设计模式系列 创建型: 1.抽象工厂模式(Abstract Factory) 2.构建者模式(Builder) 3.工厂方法模式(Factory Method) 4.原型模式( ...
- c# in deep 之委托
通俗来讲,委托就是吩咐别人去做某件事,但不知道他具体会怎么做.使用委托必须注意的一个问题是内存泄露问题:假如委托实例本身不能被回收,委托实例会阻止他的目标被作为垃圾回收.尤其是假如某“短命”的对象调用 ...
- 模仿c的字符转整数函数 atoi
#include<stdio.h> , KInvalid}; int g_nStatus = KValid; long StrToIntCore(char *str,bool minus) ...
- Hadoop Streaming框架学习(一)
Hadoop Streaming框架学习(一) Hadoop Streaming框架学习(一) 2013-08-19 12:32 by ATP_, 473 阅读, 3 评论, 收藏, 编辑 1.Had ...
- ngx-push-stream模块源码学习(五)——内存清理
1.定时器 采用nginx自身的定时器管理机制,具体细节待学习过nginx源码后加以补充 2.channel的生成周期 (0).初始(诞生) 发布.订阅均有可能产生ch ...
- java用正则表达式获取domain
在工作中经常用到获取url的来源和域名的黑白名单功能.前段时间写了一个获取url中域名的方法.但是在测试过程中发现有些小问题. /** * 根据URL获取domain * @param url * @ ...
- JS放大镜特效(兼容版)
原理 1.鼠标在小图片上移动时,通过捕获鼠标在小图片上的位置,定位大图片的相应位置 设计 1.页面元素:小图片.大图片.放大镜 2.技术点:事件捕获.定位 1)onmouseover:会在鼠标指针移动 ...