CF1252J Tiling Terrace

洛谷评测传送门

题目描述

Talia has just bought an abandoned house in the outskirt of Jakarta. The house has a nice and long yard which can be represented as a one-dimensional grid containing 1 \times N1×N cells. To beautify the house, Talia is going to build a terrace on the yard by tiling the cells. Each cell on the yard contains either soil (represented by the character '.') or rock (represented by the character '#'), and there are at most 5050 cells containing rocks.

Being a superstitious person, Talia wants to tile the terrace with mystical tiles that have the power to repel ghosts. There are three types of mystical tiles:

  • Type-1: Covers 1 \times 11×1 cell and can only be placed on a soil cell (".").
  • Type-2: Covers 1 \times 21×2 cells and can only be placed on two consecutive soil cells ("..").
  • Type-3: Covers 1 \times 31×3 cells and can only be placed on consecutive soil-rock-soil cells (".#.").

Each tile of Type-1, Type-2, and Type-3 has the power to repel G_1G1 , G_2G2 , and G_3G3 ghosts per day, respectively. There are also some mystical rules which must be followed for the power to be effective:

  • There should be no overlapping tiles, i.e. each cell is covered by at most one tile.
  • There should be at most KK tiles of Type-1, while there are no limitations for tiles of Type-2 and Type-3.

Talia is scared of ghosts, thus, the terrace (which is tiled by mystical tiles) should be able to repel as many ghosts as possible. Help Talia to find the maximum number of ghosts that can be repelled per day by the terrace. Note that Talia does not need to tile all the cells on the yard as long as the number of ghosts that can be repelled by the terrace is maximum.

输入格式

Input begins with a line containing five integers: NN KK G_1G1 G_2G2 G_3G3 ( 1 \le N \le 100,0001≤N≤100000 ; 0 \le K \le N0≤KN ; 0 \le G_1, G_2, G_3 \le 10000≤G1,G2,G3≤1000 ) representing the number of cells, the maximum number of tiles of Type-1, the number of ghosts repelled per day by a tile of Type-1, the number of ghosts repelled per day by a tile of Type-2, and the number of ghosts repelled by a tile of Type-3, respectively. The next line contains a string of NN characters representing the yard. Each character in the string is either '.' which represents a soil cell or '#' which represents a rock cell. There are at most 5050 rock cells.

输出格式

Output in a line an integer representing the maximum number of ghosts that can be repelled per day.

输入输出样例

输入 #1复制

输出 #1复制

输入 #2复制

输出 #2复制

输入 #3复制

输出 #3复制

说明/提示

Explanation for the sample input/output #1

Let "A" be a tile of Type-1, "BB" be a tile of Type-2, and "CCC" be a tile of Type-3. The tiling "ACCCBB" in this case produces the maximum number of ghosts that can be repelled, i.e. 10 + 40 + 25 = 7510+40+25=75

Explanation for the sample input/output #2

This sample input has the same yard with the previous sample input, but each tile of Type-2 can repel more ghosts per day. The tiling "BB#BBA" or "BB#ABB" produces the maximum number of ghosts that can be repelled, i.e. 100 + 100 + 10 = 210100+100+10=210 . Observe that the third cell is left untiled.

Explanation for the sample input/output #3

The tiling "ACCCA.#", "ACCC.A#", or ".CCCAA#" produces the maximum number of ghosts that can be repelled, i.e. 30 + 100 + 30 = 16030+100+30=160 . Observe that there is no way to tile the last cell.

题解:

非常容易判断是一道\(DP\)的题目。

联想一下这道题目:CF358D Dima and Hares

那么我们分方式决策,可以看出:第一种和第二种的选择都仅包含".",只有第三种选择有"#",那么我们可以考虑分段进行决策:将整个序列分成以"#"相隔开的段,并用\(a[i]\)数组保存\(i\)段中"."的个数。

那么我们设置状态\(dp[i][j][0/1]\)表示前\(j\)段用了\(i\)次方式\(1\),后面的\(0/1\)表示最后的"#"有没有用方式\(3\)所获得的最大价值。

那么我们转移的时候就只需要考虑方式二的使用次数。

转移方程需要分类讨论。另外地,还有一种情况是不选择完这\(n\)个字符。这个东西可以在枚举方式1的时候用除以二自动取整来实现。

可以结合代码理解:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int maxn=1e5+10;
int n,k,g1,g2,g3,tot,ans;
char s[maxn];
int a[maxn],dp[60][maxn][5];
//dp[i][j][0/1]表示前j段使用i次方式1,最后一个"#"是否选用方式3所得的最大利益。
signed main()
{
scanf("%I64d%I64d%I64d%I64d%I64d",&n,&k,&g1,&g2,&g3);
scanf("%s",s+1);
tot=1;
for(int i=1;i<=n;i++)
{
if(s[i]=='#')
tot++;
else
a[tot]++;
}
while(tot && !a[tot])
tot--;
if(!tot)
{
puts("0");
return 0;
}
memset(dp,0xcf,sizeof(dp));
dp[0][0][0]=0;
for(int i=1;i<=tot;i++)
for(int j=0;j<=k;j++)
{
int t=min(a[i],j);
for(int l=0;l<=t;l++)
{
if(l<=a[i])
dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-l][0]+(a[i]-l)/2*g2+l*g1);
if(l<=a[i]-1)
{
dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-l][1]+(a[i]-l-1)/2*g2+g3+l*g1);
dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-l][0]+(a[i]-l-1)/2*g2+l*g1);
}
if(l<=a[i]-2)
dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-l][1]+(a[i]-l-2)/2*g2+g3+l*g1);
}
}
for(int i=0;i<=k;i++)
ans=max(ans,dp[tot][i][0]);
printf("%I64d",ans);
return 0;
}

CF1252J Tiling Terrace的更多相关文章

  1. Tiling Terrace CodeForces - 1252J(dp、贪心)

    Tiling Terrace \[ Time Limit: 1000 ms\quad Memory Limit: 262144 kB \] 题意 给出一个字符串 \(s\),每次可以选择三种类型来获得 ...

  2. 【CF1252J】Tiling Terrace(DP)

    题意:有一个长为n的串,每个字符是#或者.中的一个,#不超过50个 有3种覆盖串的方式:(.),(..),(.#.),分别能获得g1,g2,g3的收益,覆盖之间不能重叠 第一种方式不能使用超过K次,问 ...

  3. 2019-2020 ICPC, Asia Jakarta Regional Contest

    目录 Contest Info Solutions A. Copying Homework C. Even Path E. Songwriter G. Performance Review H. Tw ...

  4. Texture tiling and swizzling

    Texture tiling and swizzling 原帖地址:http://fgiesen.wordpress.com If you’re working with images in your ...

  5. 图文详解Unity3D中Material的Tiling和Offset是怎么回事

    图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...

  6. POJ3420Quad Tiling(矩阵快速幂)

    Quad Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3740 Accepted: 1684 Descripti ...

  7. Tri Tiling[HDU1143]

    Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  8. Tiling 分类: POJ 2015-06-17 15:15 8人阅读 评论(0) 收藏

    Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8091   Accepted: 3918 Descriptio ...

  9. Tiling Up Blocks_DP

    Description Michael The Kid receives an interesting game set from his grandparent as his birthday gi ...

随机推荐

  1. (转)vue-router原理

    转载地址:https://segmentfault.com/a/1190000014822765 随着前端应用的业务功能起来越复杂,用户对于使用体验的要求越来越高,单面(SPA)成为前端应用的主流形式 ...

  2. 创建组件的方法,组件的props属性、state属性的用法和特点,父子组件传值,兄弟组件传值

    1.创建组件的方法   函数组件   class组件 1.1 函数组 无状态函数式组件形式上表现为一个只带有一个 `render()` 方法的组件类,通过函数形式或者 `ES6` 箭头 `functi ...

  3. java之逻辑运算符

    &-逻辑与    |-逻辑或    !-逻辑非    &&-短路与    ||-短路或    ^-逻辑异或 a b a&b a|b !a a^b a&& ...

  4. HTML连载52-网易注册界面之上部完成、中部初探

    一.看一下注释即可,都是前面学到的知识,然后进行整合完成网页的制作,未完待续,这个网易界面跨度可大三天. <!DOCTYPE html> <html lang="en&qu ...

  5. MongoDB自学------(5)MongoDB分片

    分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量. ...

  6. 面试必问的Spring IOC详解

    广义的 IOC IoC(Inversion of Control) 控制反转,即“不用打电话过来,我们会打给你”. 两种实现: 依赖查找(DL)和依赖注入(DI). IOC 和 DI .DL 的关系( ...

  7. laravel项目本地数据库连接错乱原因和解决方法

    由于在本地建了两个laravel项目,test.me 和 api-test.me,当我在 test.me 中调用 curl 去请求 api-test.me 的方法,试图获取数据时, 接口一直返回没有找 ...

  8. 聊一聊 bootstrap 的轮播图插件

    今天做工作的时候,轻车熟路的做完,又用到了bootstrap的轮播图,觉得有必要安利一下这个插件,如果你需要的轮播图.功能不需要太炫酷,那么bootstrap的插件是你的首要选择. 使用方式 引入js ...

  9. Java开发桌面程序学习(八)——启动浏览器或者打开资源管理器操作与hyperlink超链接的使用

    启动浏览器或者打开资源管理器 启动浏览器 java1.6版本以上,Desktop Desktop.getDesktop().browse(new URI("www.cnblogs.com/k ...

  10. Java 小游戏 - 井字棋 v1.0 (初步完成) (2018.4.16更新)

      井字棋游戏初步完成 实现功能:输入位置数据->打印棋盘->判断是否胜利->继续游戏/退出游戏 缺点:没有清屏函数   判断胜利方法太过无脑    package MYGAME; ...