CF704B Ant Man

题目传送门

一道很好的排列 dp(连续段 dp)的题目。

我们考虑从小到大插入这 n 个数,设 f[i][j] 表示现在考虑到第 i 个数,有 j 个连续段的最小权值,初始化为正无穷。

那么我们在插入一个数 i 时,要将 i 可能会产生的贡献提前计算。注意到如果 i=si=e 时贡献会有所不同,所以我们要分情况讨论:

  • i=s

    • i 插入到第一个连续段的最前面:

      f[i1][j]+xi+cif[i][j]

    • i 放在最前面自成一段,注意此时若 e 已经插入,则要求 j1

      f[i1][j]xi+dif[i][j+1]

  • i=e

    • i 插入到最后一个连续段的最后面:

      f[i1][j]+xi+aif[i][j]

    • i 放到最后面自成一段,注意此时若 s 已经插入,则要求 j1

      f[i1][j]xi+bif[i][j+1]

  • isie

    • i 插入到左边,注意若 s 已经插入,则要求 j>1

      f[i1][j]+bi+cif[i][j]

    • i 插入到右边,注意若 e 已经插入,则要求 j>1

      f[i1][j]+ai+dif[i][j]

    • i 合并两个连续段,此时要求 j2

      f[i1][j]+xi+xi+ai+cif[i][j1]

    • i 自成一段,注意若 se 若已经插入则对 j 有要求:
      f[i1][j]xixi+bi+dif[i][j+1]

最后输出 f[n][1],那这道题就愉快地结束了!

#include<bits/stdc++.h>
#define LL long long
using namespace std;

const int N=5010;

int n,s,e;
LL f[N][N];
int x[N],a[N],b[N],c[N],d[N];

int main()
{
	memset(f,0x3f,sizeof(f));
	
	scanf("%d%d%d",&n,&s,&e);
	for(int i=1; i<=n; i++)
		scanf("%d",&x[i]);
	for(int i=1; i<=n; i++)
		scanf("%d",&a[i]);
	for(int i=1; i<=n; i++)
		scanf("%d",&b[i]);
	for(int i=1; i<=n; i++)
		scanf("%d",&c[i]);
	for(int i=1; i<=n; i++)
		scanf("%d",&d[i]);
		
	f[0][0]=0;
	for(int i=1; i<=n; i++)
	{
		for(int j=0; j<i; j++)
		{
			if(i==s)
			{
				f[i][j]=min(f[i][j],f[i-1][j]+x[i]+c[i]);
				if(j>=(i>e))
					f[i][j+1]=min(f[i][j+1],f[i-1][j]-x[i]+d[i]);
			}
			else if(i==e)
			{
				f[i][j]=min(f[i][j],f[i-1][j]+x[i]+a[i]);
				if(j>=(i>s))
					f[i][j+1]=min(f[i][j+1],f[i-1][j]-x[i]+b[i]);
			}
			else
			{
				if(j>1 || (i<s && j>0))
					f[i][j]=min(f[i][j],f[i-1][j]+b[i]+c[i]);
				if(j>1 || (i<e && j>0))
					f[i][j]=min(f[i][j],f[i-1][j]+a[i]+d[i]);
				if(j>=2)
					f[i][j-1]=min(f[i][j-1],f[i-1][j]+x[i]+x[i]+a[i]+c[i]);
				if(j>=((i>s)+(i>e)))
					f[i][j+1]=min(f[i][j+1],f[i-1][j]-x[i]-x[i]+b[i]+d[i]);
			}
		}
	}
	
	printf("%lld",f[n][1]);
	
	return 0;
}
posted @   xishanmeigao  阅读(10)  评论(0编辑  收藏  举报
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示