点此看题面

大致题意: 有\(n\)个路灯,每个路灯有一定的建造费用,且建成后可照亮自身及周围距离为\(1\)的两个格子。你可以交换\(k\)次两个路灯的建造费用,求照亮所有格子的最小费用。

题意转换

首先可以发现交换显然是一个有后效性的操作,难以记录到状态中。

但是\(k\)这么小似乎别有深意?

考虑我们把一次交换分裂成两个操作,即在某一无需建路灯的位置额外建了一个路灯,和在某一需建路灯的位置免费建了一个路灯。

这样就容易\(DP\)了。

动态规划

考虑先把费用都向右移一位,再把第一个位置的费用设为\(INF\),这样一来,每个位置建路灯,就变成了影响包括其在内的前\(3\)个位置,这样就好处理多了。

我们设\(f_{i,j,t,0\sim3}\)表示当前在第\(i\)个位置,额外建了\(j\)个路灯,免费建了\(t\)个路灯,上一个路灯建在到\(i\)距离为\(0\sim3\)的位置时的最小花费。

则转移时就要根据第四维是否为\(0\)来分开处理了。

当第四维为\(0\)时,说明在当前位置建了一个路灯,则有两种情况:花钱建了一个或免费建了一个。

当第四维非\(0\)时,说明在当前位置没有建路灯,或者额外建了一个路灯。

具体实现可以详见代码。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 250000
#define K 9
#define LL long long
#define Gmin(x,y) (x>(y)&&(x=(y)))
#define INF 1e18
using namespace std;
int n,k;LL a[N+5],f[N+5][K+1][K+1][4];
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
char c,*A,*B,FI[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
}F;
int main()
{
RI i,j,t,w;LL ans=INF;for(F.read(n,k),i=1;i<=n;++i) F.read(a[i+1]);a[1]=INF;//读入,将花费右移一位
for(i=0;i<=k;++i) for(j=0;j<=k;++j) for(t=0;t<=3;++t) f[0][i][j][t]=INF;f[0][0][0][0]=0;//初始化
for(i=1;i<=n+1;++i) for(j=0;j<=k;++j) for(t=0;t<=k;++t)
{
for(w=1;w<=3;++w) f[i][j][t][w]=f[i-1][j][t][w-1];//不建路灯
f[i][j][t][0]=min(f[i][j][t][1],min(f[i][j][t][2],f[i][j][t][3]))+a[i],//花钱建路灯
t&&Gmin(f[i][j][t][0],min(f[i][j][t-1][1],min(f[i][j][t-1][2],f[i][j][t-1][3])));//免费建路灯
for(w=1;w<=3;++w) j&&Gmin(f[i][j][t][w],f[i-1][j-1][t][w-1]+a[i]);//额外建路灯
}
for(i=0;i<=k;++i) Gmin(ans,min(f[n][i][i][0],min(f[n+1][i][i][0],f[n+1][i][i][1])));//统计答案
return printf("%lld",ans),0;//输出答案
}

【CFGym102059G】Fascination Street(思维DP)的更多相关文章

  1. T2960 全民健身【思维Dp,预处理,差分优化】

    Online Judge:YCJSOI Label:Dp,思维题,预处理,滚动优化 题目描述 乐乐现在掌管一个大公司,办公楼共有n层.为了增加员工的身体素质,他决定在每层楼都建立一个活动室,活动室分乒 ...

  2. 【做题】CSA49F - Card Collecting Game——思维&dp

    原文链接 https://www.cnblogs.com/cly-none/p/CSA49F.html 题意:Alice和Bob在玩游戏.有\(n\)种卡牌,每种卡牌有\(b_i\)张,保证\(\su ...

  3. 牛客练习赛40 A 小D的剧场 (思维dp)

    链接:https://ac.nowcoder.com/acm/contest/369/A 题目描述 若你摘得小的星星 你将得到小的幸福  若你摘得大的星星 你将得到大的财富  若两者都能摘得 你将得到 ...

  4. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

    题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...

  5. Queue CodeForces - 353D (思维dp)

    https://codeforces.com/problemset/problem/353/D 大意:给定字符串, 每一秒, 若F在M的右侧, 则交换M与F, 求多少秒后F全在M左侧 $dp[i]$为 ...

  6. codeforce——思维dp

    Codeforces 822C Hacker, pack your bags!(思维)   题目大意:给你n个旅券,上面有开始时间l,结束时间r,和花费cost,要求选择两张时间不相交的旅券时间长度相 ...

  7. atcoder 2017Code festival C ——D题 Yet Another Palindrome Partitioning(思维+dp)

    题目大意: 把一个字符串s分割成m个串,这m个串满足至多有一种字符出现次数为奇数次,其他均为偶数次,问m的最小值 题解: 首先我们想一下纯暴力怎么做 显然是可以n^2暴力的,然后dp[i]表示分割到i ...

  8. 【bzoj4976】宝石镶嵌(思维dp)

    题目传送门:bzoj4976 不得不说这是道脑洞dp,思路真的清奇. 我们可以发现,虽然n很大,但是k只有100,这里面似乎隐藏了什么玄机. 我们可以发现,设总共有$ tot $个二进制位在这n个数中 ...

  9. 【洛谷5292】[HNOI2019] 校园旅行(思维DP)

    点此看题面 大致题意: 给你一张无向图,每个点权值为\(0\)或\(1\),多组询问两点之间是否存在一条回文路径. 暴力\(DP\) 首先,看到\(n\)如此之小(\(n\le5000\)),便容易想 ...

随机推荐

  1. 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志

    前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...

  2. 大话设计模式Python实现-外观模式

    外观模式(Facade Pattern):为子系统中的一组接口提供一个一致界面,此模式定义一个高层接口,使得子系统更加容易使用 下面是一个外观模式的demo: #!/usr/bin/env pytho ...

  3. 【shell脚本】通过位置变量创建Linux账户及密码===addUser.sh

    通过位置变量创建Linux账户及密码 脚本内容 [root@VM_0_10_centos shellScript]# vi addUser.sh #!/bin/bash # 通过位置变量创建系统账户及 ...

  4. PHP rand和mt_rand 区别

    mt_rand() 比rand() 快四倍使用方法 <?php//输出35echo(mt_rand(10,100));?>

  5. [线段树]区间修改&区间查询问题

    区间修改&区间查询问题 [引言]信息学奥赛中常见有区间操作问题,这种类型的题目一般数据规模极大,无法用简单的模拟通过,因此本篇论文将讨论关于可以实现区间修改和区间查询的一部分算法的优越与否. ...

  6. springboot2+shiro+jwt整合

    参考:https://www.jianshu.com/p/ef0a82d471d2 https://www.jianshu.com/p/3c51832f1051 https://blog.csdn.n ...

  7. VS 插件 ReSharper 的个人习惯

    个人习惯 1. 按 F12 恢复转到定义 很多时候,我个人不太喜欢一按 F12 就跳转到 ReSharper 自带的 查看代码浏览器,我还是喜欢 VS 默认的,于是点击菜单栏的 "RESHA ...

  8. 升级 ASP.NET Core 3.0 设置 JSON 返回 PascalCase 格式与 SignalR 问题

    由于一些 JS 组件要求 JSON 格式是 PascalCase 格式,新版本 ASP.NET Core 3.0 中默认移除了 Newtonsoft.Json ,使用了微软自己实现的 System.T ...

  9. WEBAPI 设置上传文件大小

    参考资料:https://stackoverflow.com/questions/33399267/cors-error-when-uploading-larger-files    https:// ...

  10. Linux软件安装——安装软件的命令

    Linux软件安装——安装软件的命令 摘要:本文主要学习了如何在Linux系统中安装.更新.卸载软件. rpm命令 rpm命令用来在Linux系统上进行软件的安装. 基本语法 安装命令: rpm -i ...