题意:
110米栏,运动员能够用三种状态跑,1状态耗体力f1且跑得快,2状态不消耗体力,3状态恢复体力f3但跑得慢。体力上限是M,且初始满体力,求跑完全程所用最短时间
思路:
d[i][j]表示 跑完第i个阶段,体力为j的情况下,用的最少时间 注意:j代表的时候跑完后的能量 即增完或减完或不变完
分类讨论
阶段i要按顺序遍历
体力值j从0到m遍历
对于三种模式:
快速模式:前提是当前体力值j>=该模式消耗的体力值
中速:没的说
低速:注意上限是m
#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<cstdio>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200;
int dp[maxn][maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
memset(dp,inf,sizeof(dp));
memset(dp[0],0,sizeof(dp[0]));
for(int i=1;i<=n;i++)
{
int f1,f2,t1,t2,t3;
scanf("%d%d%d%d%d",&t1,&t2,&t3,&f1,&f2);
for(int j=0;j<=m;j++)
{//分三种情况讨论
dp[i][j]=min(dp[i][j],dp[i-1][j]+t2);//Normal Mode
if(j>=f1)//Fast Mode
{
int temp=j-f1;
dp[i][temp]=min(dp[i][temp],dp[i-1][j]+t1);
}
int temp=min(j+f2,m);
dp[i][temp]=min(dp[i][temp],dp[i-1][j]+t3); //Slow Mode
}
}
int ans=inf;
for(int i=0;i<=m;i++)
ans=min(ans,dp[n][i]);
printf("%d\n",ans);
}
}