[大山中学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, ...
随机推荐
- Xamarin Mono 环境搭建
Xamarin Mono 环境搭建(使用Visual Studio 2013 开发android 和 ios ) 本文主要介绍Xamarin结合VS2013来开发Android应用程序,主要会介绍Mo ...
- OAuth简介及sina微博开放平台
OAuth简介及sina微博开放平台 2010-10-26 13:15:25 标签:新浪 sina 微博 OAuth 开放平台 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者 ...
- CSS控制文本超出后隐藏并用省略号代替
一.仅定义text-overflow:ellipsis; 不能实现省略号效果. 二.定义text-overflow:ellipsis; white-space:nowrap; 同样不能实现省略号效果. ...
- LaTeX新人30分钟从完全陌生到基本入门
From:http://www.360doc.com/content/13/0117/11/2886802_260681908.shtml 对于真心渴望迅速上手LaTeX的人,前言部分可以跳过不看. ...
- MVC 4
Asp.net MVC 4 学习笔记(一) 公司最新的产品改成MVC开发模式了,以前产品开发都是经典的三层架构.对于“听闻”过而不有实际“品偿”过MVC的程序员来说,是知识的狭隘的表现.于是乎最近在学 ...
- [置顶] Ants(Northeastern Europe 2007)
Ants Time Limit: 5 ...
- Microsoft Push Notification Service(MPNS)的最佳体验
如何获得 Microsoft Push Notification Service(MPNS)的最佳体验 有很多同学抱怨MPNS的各种问题,其中包括服务超时.返回各种错误代码不知如何处理等等..今天我用 ...
- 算法打基础——顺序统计(找第k小数)
这次主要是讲如何在线性时间下找n个元素的未排序序列中第k小的数.当然如果\(k=1 or k=n\),即找最大最小 数,线性时间内遍历即可完成,当拓展到一般,如中位数时,相关算法就值得研究了.这里还要 ...
- Asycn/Await 异步编程初窥
经过两天密集型的学习,翻阅了大量 webpages ,点击了不少重点 blogs,总算基本了解了一些 async/await 搭配使用的入门技巧,总结一下 1. async/await 应该只是语法上 ...
- C# 根据时间创建文件夹
string file = ((fileNameIndex)index).ToString(); if (!Directory.Exists(HttpContext.Current.Server.Ma ...