DP小题集
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
对于dp[i][j],预处理出一些转移一步的次数,然后可以很方便的转移:dp[i][j]=min(dp[k][j-1]+cnt[j][i])
DP小题集的更多相关文章
- 【数位DP】题集
1.[HDOJ2089] 题意:求区间内不出现4和62的数的个数 解法:模板题 2.[HDOJ3555] 题意:求区间内不出现49的数的个数 解法:模板题 3.[HDOJ5179] 题意:对于一个十进 ...
- DP小合集
1.Uva1625颜色的长度 dp[i][j]表示前一个串选到第i个 后一个串选到第j个 的最小价值 记一下还有多少个没有结束即dp2 记一下每个数开始和结束的位置 #include<cstdi ...
- 数位dp题集
题集见大佬博客 不要62 入门题,检验刚才自己有没有看懂 注意一些细节. 的确挺套路的 #include<bits/stdc++.h> #define REP(i, a, b) for(r ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- 【转】并查集&MST题集
转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...
- ACM题集以及各种总结大全!
ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...
- dp百题大过关(第一场)
好吧,这名字真是让我想起了某段被某教科书支配的历史.....各种DP题层出不穷,不过终于做完了orz 虽然各种手糊加乱搞,但还是要总结一下. T1 Monkey Banana Problem 这 ...
- ACM题集以及各种总结大全(转)
ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...
- Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题
除非特别忙,我接下来会尽可能翻译我做的每道CF题的题面! Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题 题面 胡小兔和司公子都认为对方是垃圾. 为了决出谁才是垃 ...
随机推荐
- Spring事务SPI及配置介绍
Spring事务SPI及配置介绍 标签: spring事务aop数据管理 2015-05-17 11:42 606人阅读 评论(0) 收藏 举报 分类: Spring(12) 版权声明:本文为 ...
- java 截取替换掉括号 包括括号中的内容
public static void main(String[] args) { String company = "华厦世纪(厦门)地产"; // System.out.prin ...
- Android开发 开启闪光灯 关键代码
在AndroidManifest中注册响应的权限: <uses-permission android:name="android.permission.FLASHLIGHT" ...
- 跨域Ajax原理以及浏览器同源策略
- LINUX oracle dbca无法启动
LINUX操作系统中执行DBCA无法启动 方法:执行以下命令后再执行DBCA xhost +
- day35 02-Hibernate持久化对象状态及状态转换
hibernate内置有一个c3p0,不用引入c3p0的jar包也行. 现在其实可以不用去创建表和实体类.因为hibernate可以自动帮我们生成.只要把映射建好了它就可以自动帮我们生成. 创建实体类 ...
- C#简单的图片合成及防止并发的办法
/// <summary> /// 合成图 /// </summary> private string ComposeCarBrandBadImage(AnonAttachme ...
- cocos2dx帧动画
//帧动画的创建 //方式一,通过多张图片来创建 auto sprite1 = Sprite::create("grossini_dance_05.png"); sprite1-& ...
- PCL—点云滤波(基于点云频率) 低层次点云处理
博客转载自:http://www.cnblogs.com/ironstark/p/5010771.html 1.点云的频率 今天在阅读分割有关的文献时,惊喜的发现,点云和图像一样,有可能也存在频率的概 ...
- dfs和bfs算法
1. 存储图的方式一般是有两种的:邻接表和邻接矩阵,一般存储链接矩阵的方式是比较简单的,也便于我们去实现这个临接矩阵,他也就是通俗的二维数组,我们平常用到的那种. 2. 这里我们主要记录和讲一下bfs ...