Atcoder abc の 初体験
[ABC320F] Fuel Round Trip#
若只考虑单程的,设一个
但是还需要考虑回来可能也要加油,所以综合考虑,设
考虑
若来回都不加,则
如果去的时候加,则
如果回的时候加,设下一个加油站时回时油量为
注意转移时第二维不要小于零,如果加油,转移的油量一定要大于加的油量。
复杂度
点击查看代码
#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 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效