Atcoder abc の 初体験

[ABC320F] Fuel Round Trip#

若只考虑单程的,设一个 dpi,j 表示走到第 i 个加油站剩下的油为 j 的最小花费。

但是还需要考虑回来可能也要加油,所以综合考虑,设 dpi,j,k 表示到第 i 个加油站去的途中有 j 的油量,归途有 k 的油量的最小花费。

考虑 dpi,j,k 的转移,设 d=si+1si

若来回都不加,则 dpi+1,jd,k+d=min(dpi,j,k);

如果去的时候加,则 dpi+1,min(j+fi,H)d,k+d=min(dpi,j,k+pi)

如果回的时候加,设下一个加油站时回时油量为 x ,则 min(xd+fi,H)=kk<Hx=k+lenfi ,若 k=HxH+dfi 转移就是 dpi+1,jd,x=min(dpi,j,k+pi)

注意转移时第二维不要小于零,如果加油,转移的油量一定要大于加的油量。

复杂度 O(nh2)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=500;
int s[N];
int p[N],f[N];
int dp[N][N][N];
const int inf=2139062143;
signed main(){
	int n,h;
	scanf("%d%d",&n,&h);
	int ma=0;
	for(int i=1;i<=n;i++){
		scanf("%d",&s[i]);
		ma=max(ma,s[i]-s[i-1]);
	}
	if(ma>h){
		cout<<"-1";
		return 0;
	}
	for(int i=1;i<n;i++) scanf("%d%d",&p[i],&f[i]);
	memset(dp,0x7f,sizeof(dp));
	for(int i=0;i<=h;i++){
		dp[0][h][i]=0;
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<=h;j++){
			for(int k=0;k<=h;k++){
				if(dp[i][j][k]==inf) continue;
				int len=s[i+1]-s[i];
				if(j-len>=0 && k+len<=h){
					dp[i+1][j-len][k+len]=min(dp[i+1][j-len][k+len],dp[i][j][k]);
				}
				if(min(j+f[i],h)-len>=0 && k+len<=h){
					dp[i+1][min(j+f[i],h)-len][k+len]=min(dp[i+1][min(j+f[i],h)-len][k+len],dp[i][j][k]+p[i]);
				}
				if(k<h){
					if(j-len>=0 && k-f[i]+len<=h && k>=f[i]){
						dp[i+1][j-len][k-f[i]+len]=min(dp[i+1][j-len][k-f[i]+len],dp[i][j][k]+p[i]);
					}
				}
				else{
					if(j-len>=0 && k>=f[i]){
						for(int e=h+len-f[i];e<=h;e++){
							dp[i+1][j-len][e]=min(dp[i+1][j-len][e],dp[i][j][k]+p[i]);
						}
					}
				}
			}
		}
	}
	int ans=inf;
	for(int i=0;i<=h;i++){
		ans=min(ans,dp[n][i][i]);
	}
	if(ans==inf) cout<<"-1";
	else cout<<ans<<endl;
}

作者:bloss

出处:https://www.cnblogs.com/jinjiaqioi/p/17707967.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   _bloss  阅读(66)  评论(5编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu