• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

【洛谷5052】[COCI2017-2018#7] Go(区间DP)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

点此看题面

  • \(n\)个房子和\(m\)个奖励,第\(i\)个奖励形如在第\(ti_i\)个时刻前到达第\(a_i\)个房子(\(a_i\)互不相同)可以获得\(v_i\)的收益。
  • 求从第\(k\)个房子出发能获得的最大总收益。
  • \(k\le n\le10^3,m\le100,ti_i\le2\times10^3\)

\(DP\)

由于我们走过的范围必然是包含起点\(k\)的一个区间,且我们肯定只会选择在某个奖励屋回头,因此可以设\(f_{i,j,t,0/1}\)表示走到过第\(i\sim j\)个奖励屋,当前时刻为\(t\),正处于左/右端点时的最大收益。

注意,如果起点\(k\)不是奖励屋,方便起见可以在起点随便设个奖励。

转移时只需考虑从哪个起点出发向哪个方向扩展一步,共四种情况简单讨论一下即可。

\(O(m^2t)\)

#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 M 100
#define T 2000
#define Gmax(x,y) (x<(y)&&(x=(y)))
using namespace std;
int n,m,k,a[M+5],v[M+5],ti[M+5],f[M+5][M+5][T+5][2];
int main()
{
	RI i,j,t,p;for(scanf("%d%d%d",&n,&k,&m),i=1;i<=m;++i) scanf("%d%d%d",a+i,v+i,ti+i);
	for(i=m+1;a[i-1]>=k;--i);if(a[i]^k) {for(j=++m;j^i;--j) a[j]=a[j-1],v[j]=v[j-1],ti[j]=ti[j-1];a[i]=k,v[i]=0;}k=i;//强制k为奖励屋
	for(i=k;i;--i) for(j=k;j<=m;++j) for(t=0;t<=T;++t) f[i][j][t][0]=f[i][j][t][1]=-1e9;f[k][k][0][0]=v[k];//初始化
	RI ans=0;for(i=k;i;--i) for(j=k;j<=m;++j) for(t=0;t<=T;++t) Gmax(ans,f[i][j][t][0]),Gmax(ans,f[i][j][t][1]),//更新答案
		i^1&&t+a[i]-a[i-1]<=T&&Gmax(f[i-1][j][t+a[i]-a[i-1]][0],f[i][j][t][0]+(t+a[i]-a[i-1]<ti[i-1]?v[i-1]:0)),//从左端点向左扩一步
		i^1&&t+a[j]-a[i-1]<=T&&Gmax(f[i-1][j][t+a[j]-a[i-1]][0],f[i][j][t][1]+(t+a[j]-a[i-1]<ti[i-1]?v[i-1]:0)),//从右端点向左扩一步
		j^m&&t+a[j+1]-a[i]<=T&&Gmax(f[i][j+1][t+a[j+1]-a[i]][1],f[i][j][t][0]+(t+a[j+1]-a[i]<ti[j+1]?v[j+1]:0)),//从左端点向右扩一步
		j^m&&t+a[j+1]-a[j]<=T&&Gmax(f[i][j+1][t+a[j+1]-a[j]][1],f[i][j][t][1]+(t+a[j+1]-a[j]<ti[j+1]?v[j+1]:0));//从右端点向右扩一步
	return printf("%d\n",ans),0;
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go 语言入门介绍发布时间:2022-07-10
下一篇:
go测试--进阶发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap