把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

【CFGym102059G】Fascination Street(思维DP)

点此看题面

大致题意:\(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;//输出答案
} 
posted @ 2019-07-20 12:42  TheLostWeak  阅读(251)  评论(0编辑  收藏  举报