P6064 [USACO05JAN]Naptime G
最近做了多少道 usaco 了,连 FJ 都认识我了呀
题意描述
给你 \(N\) 段时间其中 \(B\) 段时间你要用来睡眠,再给你每个时间睡眠可获得的效用值 \(U_i\)。
可惜的是你每次睡眠的第一段时间都要用来入睡(安眠药它不香吗)。
求你可以获得的最大效用值。
算法分析
一眼看上去就是 DP 啊。
定义 \(f(i,j,1/0)\) 表示:在第 \(i\) 段时间,已近休息了 \(j\) 段时间,此时是否休息。
假设没有循环时间,那么状态转移方程为:
\(f(i,j,1)=max(f(i-1,j-1,0),f(i-1,j-1,1)+u_i)\)
\(f(i,j,0)=max(f(i-1,j,0),f(i-1,j,1))\)
\(f(i,0,0)=f(1,1,1)=0(1\leq i\leq n),f(i,j,0/1)=-INF(2\leq i,j\leq n)\)
那么如果没有时间阶段是不断循环的圆这句话这道题就没了。
那么有的话怎么办办呢?(暗杀良心出题人同志并把这句话删了)
我的思路是枚举每一段时间为起点,做一次 DP,默默算算时间(\(O(n^3)\))后自闭。
后来老师说其实只需要两次 DP:
- 正常的当时间循环不存在的 DP。
- 保证最后一段时间入睡,第一段时间睡着的 DP。(否则时间循环将没有任何意义)
然后就没了。
代码实现
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
#define N 3831
using namespace std;
int n,m,a[N],f[N][N][2],ans=0;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0' && c<='9') x=x*10+c-48,c=getchar();
return x*f;
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
memset(f,0xcf,sizeof(f));
f[1][1][1]=0;
for(int i=1;i<=n;i++) f[i][0][0]=0;
for(int i=2;i<=n;i++)
for(int j=1;j<=m;j++){
f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1]);
f[i][j][1]=max(f[i-1][j-1][0],f[i-1][j-1][1]+a[i]);
}
ans=max(f[n][m][0],f[n][m][1]);
memset(f,0xcf,sizeof(f));
f[1][1][1]=a[1];
for(int i=1;i<=n;i++) f[i][0][0]=0;
for(int i=2;i<=n;i++)
for(int j=1;j<=m;j++){
f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1]);
f[i][j][1]=max(f[i-1][j-1][0],f[i-1][j-1][1]+a[i]);
}
ans=max(ans,f[n][m][1]);
printf("%d\n",ans);
return 0;
}
完结撒花。
P6064 [USACO05JAN]Naptime G的更多相关文章
- 【做题记录】DP 杂题
P2577 [ZJOI2004]午餐 $\texttt{solution}$ 想到贪心: 吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 状态: \(f[i][j]\) 表示前 \(i\ ...
- Storyboards Tutorial 03
这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...
- 文件图标SVG
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink ...
- [题解] [USACO05JAN]Muddy Fields G
题目TP门 题目大意 在一个 \(R×C\) 的矩阵中,每个点有两个状态:草地和泥地.你需要在泥地里铺 \(1×k\) 木块, \(k\) 为任意整数,求最少要多少木块. 思路 两个横向木块不会互相干 ...
- [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)
在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库 ...
- CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
---恢复内容开始--- CentOS 6.6 升级GCC G++ (当前最新GCC/G++版本为v6.1.0) 没有便捷方式, yum update.... yum install 或者 添加y ...
- Linux deepin 下sublimes配置g++ openGL
参考 :http://blog.csdn.net/u010129448/article/details/47754623 ubuntu 下gnome只要将代码中deepin-terminal改为gno ...
- [翻译svg教程]svg 中的g元素
svg 中的<g>元素用来组织svg元素.如果一组svg元素被g元素包裹了,你可以通过对g元素进行变换(transform),被g元素包裹的元素也将被变换,就好这些被svg包裹的元素是一个 ...
- 软件工程:黄金G点小游戏1.0
我们要做的是黄金G点小游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值. ...
随机推荐
- This is Riv3r1and.
总是要弄个博客来搞的嘛.
- LCD显示器缺陷自动化检测方案
很牛的测试 参考: 1.https://www.radiantvisionsystems.com/ 2.https://www.radiantvisionsystems.com/node/275 LC ...
- devops-jenkins基于角色的权限管理RBAC
一. devops-jenkins基于角色的权限管理RBAC 1 安装角色的rbac角色管理 1.1) 点击系统管理 1.2) 选择插件管理 1.3) 选择可选插件,输入role搜索 1.4) 选择 ...
- 2017-18一《电子商务概论》专科作业--经管B1601/2、经管B1631
第1次作业: 1.你如何来定义和理解电子商务?电子商务对社会经济带了怎样的影响,企业.消费者的反应如何?你知道哪些电子商务企业,他们都属于什么类型? 2.请详细阐述应该如何关注哪些事项才能在淘宝网成功 ...
- 多测师讲解html _链接标签004_高级讲师肖sir
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>链 ...
- IP协议那些事
IP协议作为通信子网的最高层.提供无连接的数据报传输机制. IP协议的作用 寻址和路由 传递服务:提供不可靠,无连接的服务. 为什么说IP协议不可靠.无连接 不可靠:是指不能保证IP数据包能成成功到达 ...
- 使用 volatile 关键字保证变量可见性和禁止指令重排序
volatile 概述 volatile 是 Java 提供的一种轻量级的同步机制.相比于传统的 synchronize,虽然 volatile 能实现的同步性要差一些,但开销更低,因为它不会引起频繁 ...
- k8s-命令创建service
查看命令帮助 [root@master kubernetes]# kubectl create service -h Create a service using specified subcomma ...
- scrapy数据写入管道
1 setting里面启动管道 ITEM_PIPELINES = { 'ganji.pipelines.GanjiPipeline': 300,}2 拿到的数据通过yield返回给管道 # -*- c ...
- MySQL字段添加注释,但不改变字段的类型
之前在导数据库数据的时候,忘记将字段的注释导过来了.现在需要将所有字段都加上注释(崩溃).由于导数据的过程比较长,业务那边从原始数据库导出了一个 Excel,里面有所有字段的注释,然后让我们根据这个注 ...