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. dubbo-Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError

    dubbo-2.8.4需用jdk版本为1.8,dubbo-2.5.3可以使用1.7版本的jdk.

  2. eclipse中创建maven web项目

    本文主要说明将maven web项目转成eclipse支持的web项目. 创建一个maven项目设置打包类型为war则其为web项目 结构如下 将mavenweb项目转成eclipse识别的web项目 ...

  3. Django的Model使用

    创建模型 使用Django的模型主要注意两个方面:字段的类型和方法的重写.这里用一个例子来说明,其中包含了常用的字段类型和如何重写方法. from django.db import models cl ...

  4. od命令 查看二进制文件

    od命令用于输出文件的八进制.十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符. 以数值进制格式输出:od [选项] 文件 od   -d 文件       --十进制输 ...

  5. 进度条控件JProgressBar的使用

    ----------------siwuxie095                             工程名:TestUI 包名:com.siwuxie095.ui 类名:TestList.j ...

  6. keystone组件

    引:  什么是keystone    为何要有keystone     keystone的功能     keystone概念详解     keystone与openstack其他组件关系      k ...

  7. 40、inner mate distance for paired reads in a bam file

    参考:https://www.biostars.org/p/106291/#106344 1.inner mate distance : the distance from the right mos ...

  8. cakephp数据库配置

  9. JavaScript 学习中

    邮箱的验证: <!DOCTYPE html><html>    <head>        <meta charset="UTF-8"&g ...

  10. javax.swing.Timer

    javax.swing 类 Timer java.lang.Object javax.swing.Timer 所有已实现的接口: Serializable public class Timerexte ...