BZOJ 4244: 邮戳拉力赛

本文介绍了一种使用动态规划算法解决括号序列转化问题的方法。通过定义状态转移方程,实现对括号序列的有效转化,同时考虑了边界条件和成本函数。文章通过具体的代码示例展示了算法的实现过程。

转化为括号序列DP

注意边界

#include<cstdio>
#include<algorithm>
#define rep(i,x,y) for (int i=x; i<=y; i++)
using namespace std;
long long F[3005][3005];
int main(){
	int n,T;
	scanf("%d%d",&n,&T);
	rep(i,0,n) rep(j,0,n+1) F[i][j]=1ll<<60;
	F[0][0]=0;
	for (int i=1; i<=n; i++){
		int u,v,d,e;
		scanf("%d%d%d%d",&u,&v,&d,&e);
		for (int j=0; j<=n; j++) F[i][j]=min(F[i][j],F[i-1][j]+u+v);
		for (int j=1; j<=n; j++) F[i][j]=min(F[i][j],F[i-1][j]+e+d);
		for (int j=1; j<=n; j++) F[i][j]=min(F[i][j],F[i-1][j-1]+d+v);
		for (int j=0; j<=n; j++) F[i][j]=min(F[i][j],F[i-1][j+1]+u+e);
		for (int j=1; j<=n; j++) F[i][j]=min(F[i][j],F[i][j-1]+d+v);
		for (int j=n; j>=0; j--) F[i][j]=min(F[i][j],F[i][j+1]+u+e);
		for (int j=0; j<=n; j++) F[i][j]+=2*j*T;
	}
	printf("%lld\n",F[n][0]+(n+1)*T);
	return 0;
}

  

转载于:https://www.cnblogs.com/silenty/p/9858757.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值