P2736 “破锣摇滚”乐队 Raucous Rockers

你刚刚继承了流行的“破锣摇滚”乐队录制的尚未发表的N(1 <= N <= 20)首歌的版权。你打算从中精选一些歌曲,发行M(1 <= M <= 20)张CD。每一张CD最多可以容纳T(1 <= T <= 20)分钟的音乐,一首歌不能分装在两张CD中。CD数量可以用完,也可以不用完

不巧你是一位古典音乐迷,不懂如何判定这些歌的艺术价值。于是你决定根据以下标准进行选择:

1.歌曲必须按照创作的时间顺序在所有的CD盘上出现。(注:第i张盘的最后一首的创作时间要早于第i+1张盘的第一首)

2.选中的歌曲数目尽可能地多

输入格式:

第一行: 三个整数:N, T, M.

第二行: N个整数,分别表示每首歌的长度,按创作时间顺序排列。

[样例输入]

4 5 2

4 3 4 2

[样例输出]

3

题解

设f[i][j]表示选了i张CD,最后一张用了j分钟能存的最大歌曲数

01背包从大到小枚举

    for(int i=1;i<=N;i++){
for(int m=M;m>=1;m--)//注意:因为是01背包,所以要从后往前更新状态
for(int j=T;j>=t[i];j--)
f[m][j]=max(f[m][j],f[m-1][T]+1,f[m][j-t[i]]+1);//状态转移
}
cout<<f[M][T];

P1650 田忌赛马

P2587 [ZJOI2008]泡泡堂(双倍经验)

田忌和齐王赛马,给定两边n匹马能力值,赢一场加200分,输一场减200分,平局得0分,安排出场顺序,使得得分最多.

贪心搞两个指针,如果最好的相比能赢或者最差的相比能赢就直接出,否则用最自己差的和对方最好的比

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
} const int MAXN=2005; int a[MAXN],b[MAXN],f[MAXN][MAXN];
int n,ans; int main(){
n=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++) b[i]=read();
sort(a+1,a+n+1);
sort(b+1,b+n+1);
for(register int i=1,la=1,ra=n,lb=1,rb=n;i<=n;i++){
if(a[ra]>b[rb]){
ans+=200;
ra--,rb--;
}
else if(a[la]>b[lb]){
ans+=200;
la++,lb++;
}
else if(a[la]<b[rb]){
ans-=200;
la++,rb--;
}
else la++,rb--;
}
printf("%d\n",ans);
}

P2592 [ZJOI2008]生日聚会

有\(n\)个男孩和\(m\)个女孩坐成一排,求任意一段区间内男孩和女孩的数量之差不超过\(K\)的方案数.

\(f[i][j][x][y]\)应该是前\(i\)个人中有\(j\)个是男生,以当前点为结尾的任意一段不超过\(k\)的区间男生比女生最多多\(x\)人,女生比男生最多多\(y\)人的方案数

设状态的时候注意,这一题中两维的状态根本无法描述全部情况,至少开第三维,然而还是不能解决问题,考虑到数据范围很小,就开到了第四维.

采用刷表法更方便.\(f[0][0][0][0]=1.\)

这样搞可以保证转移的合法性,最终统计答案的时候就直接把使用的\(f[n+m][m][i][j]\)加起来就可以了.

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
} const int MAXN=155;
const int MAXK=21;
const int mod=12345678; int f[MAXN<<1][MAXN][MAXK][MAXK];
int n,m,K,ans; int main(){
n=read(),m=read(),K=read();
f[0][0][0][0]=1;
for(int i=0;i<=n+m-1;i++)
for(int j=0;j<=n;j++)
for(int x=0;x<=K;x++)
for(int y=0;y<=K;y++)
if(f[i][j][x][y]){
if(j+1<=n&&x+1<=K) (f[i+1][j+1][x+1][max(y-1,0)]+=f[i][j][x][y])%=mod;
if(i-j+1<=m&&y+1<=K) (f[i+1][j][max(x-1,0)][y+1]+=f[i][j][x][y])%=mod;
}
for(int i=0;i<=K;i++)
for(int j=0;j<=K;j++)
(ans+=f[n+m][n][i][j])%=mod;
printf("%d\n",ans);
}

P2600 [ZJOI2008]瞭望塔

\(Link2\): BZOJ1038

一个村庄有n个点,两个点之间轮廓线是直线,在一个地方修一定高度的瞭望塔,要求能看到村庄的每一个地方,求瞭望塔高度的最小值.(正解计算几何)

n<=300

题解

瞭望塔的横坐标一定在两条直线的交点处,所以我们先利用开始的n个点求出n-1条直线,然后两两枚举求交点的横坐标。对于每一个横坐标再通过枚举n-1条直线求最高点,然后答案取一个最小值即可

复杂度$ O(n^3)$

#include<bits/stdc++.h>
using namespace std; const int MAXN=305;
const double INF=1e15; double x[MAXN],y[MAXN],k[MAXN],b[MAXN];
int n;
double ans=INF; inline double calc(double x){
double res=0;
for(int i=1;i<n;i++){
res=max(res,k[i]*x+b[i]);
}
return res;
} int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lf",&x[i]);
for(int i=1;i<=n;i++) scanf("%lf",&y[i]);
for(int i=1;i<n;i++){
k[i]=(y[i+1]-y[i])/(x[i+1]-x[i]);
b[i]=y[i]-k[i]*x[i];
}
for(int i=1;i<=n;i++){
ans=min(ans,calc(x[i])-y[i]);//先枚举每个端点,也不知道为什么这是必需的
}
for(int i=1;i<n;i++)
for(int j=1;j<i;j++){
double pos=(b[j]-b[i])/(k[i]-k[j]);//算出两条直线交点的横坐标
int t=upper_bound(x+1,x+n,pos)-x-1;//这个横坐标与第t条直线有关
if(x[t]<=pos&&pos<=x[t+1])//注意这里的细节,以后留个心眼
ans=min(ans,calc(pos)-(k[t]*pos+b[t]));
}
printf("%.3lf\n",ans);
}

P4267 [USACO18FEB]Taming the Herd

Luogu4267

题解

对于dp[i][j],预处理出一些转移一步的次数,然后可以很方便的转移:dp[i][j]=min(dp[k][j-1]+cnt[j][i])

DP小题集的更多相关文章

  1. 【数位DP】题集

    1.[HDOJ2089] 题意:求区间内不出现4和62的数的个数 解法:模板题 2.[HDOJ3555] 题意:求区间内不出现49的数的个数 解法:模板题 3.[HDOJ5179] 题意:对于一个十进 ...

  2. DP小合集

    1.Uva1625颜色的长度 dp[i][j]表示前一个串选到第i个 后一个串选到第j个 的最小价值 记一下还有多少个没有结束即dp2 记一下每个数开始和结束的位置 #include<cstdi ...

  3. 数位dp题集

    题集见大佬博客 不要62 入门题,检验刚才自己有没有看懂 注意一些细节. 的确挺套路的 #include<bits/stdc++.h> #define REP(i, a, b) for(r ...

  4. 贪心/构造/DP 杂题选做Ⅲ

    颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...

  5. 【转】并查集&MST题集

    转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...

  6. ACM题集以及各种总结大全!

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  7. dp百题大过关(第一场)

    好吧,这名字真是让我想起了某段被某教科书支配的历史.....各种DP题层出不穷,不过终于做完了orz 虽然各种手糊加乱搞,但还是要总结一下. T1 Monkey Banana Problem    这 ...

  8. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  9. Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题

    除非特别忙,我接下来会尽可能翻译我做的每道CF题的题面! Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题 题面 胡小兔和司公子都认为对方是垃圾. 为了决出谁才是垃 ...

随机推荐

  1. LNMP 1.6 常见的502问题解决

    在nginx上跑discuz,先修改配置文件 cd /usr/local/nginx/conf/vhosts/ vim test.conf server { listen ; server_name ...

  2. Hbase表重命名 表改名

    PS:现在我有个表 :test11_new  ,我要给他改名 开始: 1.先disable掉表hbase(main):023:0> disable 'test11_new' 0 row(s) i ...

  3. from xml.etree import cElementTree as ET

  4. ms project展开和折叠任务

    1.视图——大纲——显示子任务 2.视图——大纲——隐藏子任务

  5. POJ 1187 陨石的秘密 (线性DP)

    题意: 公元11380年,一颗巨大的陨石坠落在南极.于是,灾难降临了,地球上出现了一系列反常的现象.当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点.经过一番侦察,科学家们发现陨石上 ...

  6. newcoder中的基础题

    1. mysql_num_fields()  函数返回结果集中字段的数 2. <?php class A{ ; } $a = new A(); $b = $a; $a; echo $b-> ...

  7. 数据库之_CRUD

    CRUD是指在做计算处理时的增加(Create).读取查询(Retrieve).更新(Update)和删除(Delete)几个单词的首字母简写.主要被用在描述软件系统中DataBase或者持久层的基本 ...

  8. (数组)Largest Rectangle in Histogram(栈解问题)

    Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...

  9. CodeForces 782B The Meeting Place Cannot Be Changed (二分)

    题意:题意:给出n个人的在x轴的位置和最大速度,求n个人相遇的最短时间. 析:二分时间,然后求并集,注意精度,不然会超时. 代码如下: #pragma comment(linker, "/S ...

  10. 《Maven实战》笔记-3-Maven仓库

    一.Maven仓库的分类 1.本地仓库 一般来说,在Maven项目目录下,没有诸如lib/这样用来存放依赖文件的目录. 要自定义本地仓库目录地址时,可以编辑文件~/.m2/setting.xml,设置 ...