Tiling Terrace

\[Time Limit: 1000 ms\quad Memory Limit: 262144 kB
\]

题意

给出一个字符串 \(s\),每次可以选择三种类型来获得价值

\(Type1:“.”\) 获得 \(w_1\) 元

\(Type2:“..”\) 获得 \(w_2\) 元

\(Type3:“.\#.”\) 获得 \(w_3\) 元

此外,还有两个限制条件

\(Limti1:Type1\) 至多只能选 \(K\) 个

\(Limit2:\) 每个字符只能被选择一次

问最多可以获得的价值。

思路

首先可以发现,对于两个相邻的 \(\#\),如果我们确定了这两个的状态,也就是不用或者当成 \(Type3\) 来用,那么我们就可以知道这两个 \(\#\) 之间可用 \(.\) 的数量。如果这个数量是奇数,那么意味着其中有一个 \(.\) 拿来用作 \(Type1\) 是必然不会亏的,也就是这个 \(.\) 是白嫖的。

令 \(dp[i][j][k][0/1]\) 表示到第 \(i\) 个 \(\#\) 号为止,白嫖了 \(j\) 个 \(Type1\),选了 \(k\) 个 \(Type3\),并且第 \(i\) 个 \(\#\) 是否当成 \(Type3\) 来用。

为了方便计算,我们可以在整个字符串的开头加入一个 \(\#\),整个字符串的结尾加入一个 \(\#\),那么整个的状态必然要从 \(dp[0][0][0][0]\) 开始递推,必然以 \(dp[\#_{number}][j][k][0]\) 结尾。

这样推出来以后,我们就知道了白嫖 \(a\) 个 \(Type1\),选 \(c\) 个 \(Type3\) 的情况下,最多可以获得多少个 \(b\)。最后对 \(a、b、c\) 贪心求答案,尝试在 \(Type1\) 不超过 \(K\) 的情况下把 \(Type2\) 换成 \(Type1\)。

我们可以发现,由于 \(\#\) 的个数最多就 \(50\) 个,那么白嫖的 \(Type1\) 必然不会超过 \(51\),所以整个 \(dp\) 的复杂度是 \(O\left(50^3\times4\right)\) 的

/***************************************************************
> File Name : J.cpp
> Author : Jiaaaaaaaqi
> Created Time : Tue 05 Nov 2019 10:00:31 PM CST
***************************************************************/ #include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pb push_back
#define pii pair<int, int> typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 1e5 + 10;
const int maxm = 1e5 + 10;
const ll mod = 1e9 + 7;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; int n, m;
int cas, tol, T; ll g1, g2, g3;
char s[maxn];
ll dp[60][60][60][2];
vector<int> vv; ll calc(ll a, ll b, ll c) {
if(a > m) a = m;
ll ans = a*g1 + c*g3;
ll tmp = min(b, (m-a)/2);
ll res = max(b*g2, (b-tmp)*g2 + tmp*2ll*g1);
if(a+tmp*2<m && b-tmp>0) res = max(res, res-g2+g1);
return ans+res;
} int main() {
// freopen("in", "r", stdin);
scanf("%d%d%lld%lld%lld", &n, &m, &g1, &g2, &g3);
scanf("%s", s+1);
vv.clear();
vv.pb(0);
for(int i=1; i<=n; i++) {
if(s[i]=='#') vv.pb(i);
}
vv.pb(n+1);
for(int i=0; i<60; i++) for(int j=0; j<60; j++)
for(int k=0; k<60; k++) for(int z=0; z<2; z++)
dp[i][j][k][z] = -INF;
dp[0][0][0][0] = 0;
int sz = vv.size()-1;
for(int i=0; i<sz; i++) {
int s = vv[i+1]-vv[i]-1;
for(int j=0; j<60; j++) {
for(int k=0; k<60; k++) {
if(dp[i][j][k][0] >= 0) {
if(s>=0) dp[i+1][j+s%2][k][0] = max(dp[i+1][j+s%2][k][0], dp[i][j][k][0] + s/2);
if(s>=1) dp[i+1][j+(s-1)%2][k][1] = max(dp[i+1][j+(s-1)%2][k][1], dp[i][j][k][0] + (s-1)/2);
}
if(dp[i][j][k][1] >= 0) {
if(s>=1) dp[i+1][j+(s-1)%2][k+1][0] = max(dp[i+1][j+(s-1)%2][k+1][0], dp[i][j][k][1] + (s-1)/2);
if(s>=2) dp[i+1][j+(s-2)%2][k+1][1] = max(dp[i+1][j+(s-2)%2][k+1][1], dp[i][j][k][1] + (s-2)/2);
}
}
}
}
ll ans = 0;
for(int i=0; i<60; i++) for(int j=0; j<60; j++) if(dp[sz][i][j][0]>=0)
ans = max(ans, calc(i, dp[sz][i][j][0], j));
printf("%lld\n", ans);
return 0;
}

Tiling Terrace CodeForces - 1252J(dp、贪心)的更多相关文章

  1. CF1252J Tiling Terrace

    CF1252J Tiling Terrace 洛谷评测传送门 题目描述 Talia has just bought an abandoned house in the outskirt of Jaka ...

  2. 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

  3. CodeForces - 158B.Taxi (贪心)

    CodeForces - 158B.Taxi (贪心) 题意分析 首先对1234的个数分别统计,4人组的直接加上即可.然后让1和3成对处理,只有2种情况,第一种是1多,就让剩下的1和2组队处理,另外一 ...

  4. BZOJ 2021 [Usaco2010 Jan]Cheese Towers:dp + 贪心

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2021 题意: John要建一个奶酪塔,高度最大为m. 他有n种奶酪.第i种高度为h[i]( ...

  5. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  6. 线段树+dp+贪心 Codeforces Round #353 (Div. 2) E

    http://codeforces.com/contest/675/problem/E 题目大意:有n个车站,每个车站只能买一张票,这张票能从i+1到a[i].定义p[i][j]为从i到j所需要买的最 ...

  7. Codeforces #550 (Div3) - G.Two Merged Sequences(dp / 贪心)

    Problem  Codeforces #550 (Div3) - G.Two Merged Sequences Time Limit: 2000 mSec Problem Description T ...

  8. Codeforces Round #353 (Div. 2) E. Trains and Statistic dp 贪心

    E. Trains and Statistic 题目连接: http://www.codeforces.com/contest/675/problem/E Description Vasya comm ...

  9. CodeForces - 940E - Cashback +贪心+DP

    传送门:CodeForces - 940E - Cashback 题意:在一个长度为n的数组中,可以分出长度为 k 连续的多个数组b(每个数组 b 的 k 可不相同),然后,可以对每个数组 b 进行删 ...

随机推荐

  1. [PKUSC2018]最大前缀和(状压DP)

    题目大意:求给定的 $n$ 个数的所有排列的最大前缀和(不能为空)之和对 $10^9+7$ 取模的值. $1\le n\le 20,1\le\sum|a_i|\le 10^9$. 神级DP.杂题选讲的 ...

  2. Paper | Quality assessment of deblocked images

    目录 1. 故事 2. 失真变化 3. 方法(PSNR-B) 4. 实验 这篇文章提出了一个PSNR-B指标,旨在衡量 压缩图像的块效应强度 或 去块效应后的残留块效应强度(比较去块效应算法的优劣). ...

  3. 【笔记】Java微服务之路(持续更新)

    微服务架构的说明: 微服务的架构风格是将一个单体的应用程序开发拆解为一组"小"的服务,这里的"小"是以业务边界 来区分的,而不是根据代码的多少区分.每个服务都运 ...

  4. vue-cli安装以及创建一个简单的项目(一)(Node\npm\webpack简单使用)

    1.关系介绍 1.简单的说 Node.js 就是运行在服务端的 JavaScript. 2.NPM是随同NodeJS一起安装的包管理工具(新版的nodejs已经集成了npm),能解决NodeJS代码部 ...

  5. Kubernetes 动态PV使用

    Kubernetes 动态PV使用 Kubernetes支持动态供给的存储插件:https://kubernetes.io/docs/concepts/storage/storage-classes/ ...

  6. Quartz的配置与使用

    什么是Quartz Quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为 ...

  7. DVWA-CSRF学习笔记

    DVWA-CSRF学习笔记 一.CSRF(跨站请求伪造) CSRF(跨站请求伪造),是指利用受害者尚未失效的身份认证信息(cookie.session会话等),诱骗其点击恶意链接或者访问包含攻击代码的 ...

  8. pip下载速度慢解决方法

    添加镜像链接 解决方式: 更改pip的数据源.目前国内比较知名的有豆瓣的,清华的.都是pipy官网的镜像. 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里 ...

  9. charles注册码及中文版本,支持window和mac

    安装证书: 安装完证书之后设置代理 2个* ,代表全部 注册码: Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 破 ...

  10. Linux出现You have new mail in /var/spool/mail/root提示,关闭邮件提示清理内容的解决方案

    Linux出现You have new mail in /var/spool/mail/root提示,关闭邮件提示的解决方案 有的时候敲一下回车,就出来You have new mail in /va ...